EntityFrameworkとドメインモデルを使用して既存のユーザーを新しいデータで更新する際の質問があります。実際にはもっと問題に似ています。EntityFrameworkがエンティティに新しいデータを保存しない
Order
をOrderEntity
に変換した後、UserEntity
に追加してデータベースに保存すると、指定した注文は保存されません。
だから私たちはここにIUserModel
を持っている:
public interface IUser
{
int ID { get; }
List<IOrder> Orders { get; }
}
そして、ここでエンティティUserEntity
:
public class UserEntity
{
int ID { get; set; }
public List<OrderEntity> Orders { get; set; }
}
私たちはここPersistenceService
サービスと呼ばれています:データベース内
public async Task<bool> UpdateInformation(IUser user)
{
using (var databaseContext = new DatabaseContext())
{
var userEntity = await database.Users.Include(u => u.Orders)
.FirstOrDefaultAsync(x => x.ID == user.ID);
userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity)
databaseContext.Entry(userEntity).State
= EntityState.Modified; // Do we need this?
databaseContext.Entry(userEntity.Orders).State
= EntityState.Modified; // Do we need this?
await databaseContext.SaveChangesAsync();
}
}
テーブル次のようになります。
Orders User
-------- --------
int ID int ID
Money Price
int UserId -- foreign key to user that owns this order
編集:いくつかの時点で ユーザーは、我々がこれを行う呼び出す順序を作成したい場合:
public async void AddNewOrder(IOrder order)
{
IUser user = GetActiveUser(); // This just return an IUser
var persistenceService = GetPersistenceService(); // returns instance of persistence service
user.Orders.Add(order);
await persistenceService.UpdateInformation(user);
}
編集2016年9月11日:より多くのデバッグ後 を、それが見えます
await persistenceService.UpdateInformation(user);
シンクを実行するコードを変更しても、これは変更されません。ロンリー的にも。だから、スレッドの問題はありません。
このメソッドはどのように呼び出していますか? SaveChangesAsyncが機能するための時間を与える必要があります。あなたはUpdateInformation()を試しましたか?GetAwaiter()。GetResult()? –
DavidGによると、単に注文を更新してユーザーと関連付けるのではないようだ。 –
申し訳ありませんが、@ RicardoPeresも役立ちませんが、注文がどのようにユーザに追加されたかを示す編集を行ったので、同期作業を行うことで問題は解決されません。 – Nicholas