まだ私の最初のUWP/MVVM/EFコアアプリケーションで作業しています。ビューモデルからレコードを更新する正しい方法は何ですか?
私のビューモデルにDbContextについての知識を持たせたくありません。だから私は、私のビューモデルに注入、次のItemServiceクラスを作成しました。
public class ItemService : IItemService
{
public async Task SaveAsync(Item item)
{
using (var db = new MyDbContext())
{
db.Items.Add(item);
await db.SaveChangesAsync();
}
}
}
私ItemViewModelは、次のコマンドが含まれています。私はアイテムを保存するとき
public RelayCommand SaveCommand { get; private set; }
private async void Save()
{
if (!SaveCommand.CanExecute(Item))
return;
await ItemService.SavAsync(Item);
}
これは素晴らしい作品。 SaveAsyncメソッドは、DbContextの新しいインスタンスを作成し、作成したばかりのアイテムを追加してから、その変更をデータベースにコミットします。
私の質問は、既存のレコードの更新についてです。私はこのようなことについて考えています:
public class ItemService : IItemService
{
public async Task UpdateAsync(Item item)
{
using (var db = new MyDbContext())
{
Item dbItem = (from i in db.Items
where i.Id = item.Id
select i).FirstOrDefault();
// Here I should duplicate all the item's properties into dbItem ones
await db.SaveChangesAsync();
}
}
}
私はこの解決法が嫌いです! dbItemにitemのすべてのプロパティをコピーする必要があります。もし私が忘れたら?私はICloneableを実装することができますが、私は本当にすべてのエンティティに対してそれを行うオーバーヘッドを見つける。
ここで正しいパターンは何ですか。ビューモデルによって管理されるレコードを更新する最善の方法は?事前に
多くのおかげで、 ジュリアン
私はほとんど「良い」方法を見ていません。すべてのプロパティをチェックして、変更されていないプロパティを書き換えないようにすることはできますが、それでもある時点ですべてのプロパティを処理する必要があります。 – Kilazur
Automapper http://automapper.org/を使ってマッピングの問題を回避することができます – Rohit
Automapperは怪物の最後の避難所です。それを使用しないでください。そしてあなたの本当の疑問は、「EFコアで切り離されたモデルをどのように更新するのですか?実際にはwpfやmvvmとは関係ありません。 – Will