次に、AutoMapper を使用してコンテンツを更新します
これは正しくありません -クラスMapper.Map<MyEntity>(viewModel)
の新しいインスタンスを返します。MyEntity
既存のインスタンスのプロパティは更新されません。その新しいインスタンスをコンテキストにアタッチする必要があります。
var entity = Context.MyEntities.Find(id); // this line is useless
entity = Mapper.Map<MyEntity>(viewModel);
Context.MyEntities.Attach(entity);
Context.SaveChanges;
また、新しいエンティティを作成する場合、コンテキストからエンティティを取得しても意味がありません。異なるオブジェクトへの参照を保持するために同じ変数を再利用していますが、これは混乱を招きます。実際に何が起こるかは、次のように説明できます。
var entityFromDb = Context.MyEntities.Find(id);
var competelyNewEntity = Mapper.Map<MyEntity>(viewModel);
Context.MyEntities.Attach(competelyNewEntity);
Context.SaveChanges;
2 番目のオプションでは、コンテキスト内に存在するエンティティのプロパティを更新しています。アタッチする必要はありません。
ところで、3番目のオプション(そして最良の方法)があります-代わりに宛先エンティティを更新する別のマッピング方法を使用します:
var entity = Context.MyEntities.Find(id);
Mapper.Map(viewModel, entity); // use this method for mapping
Context.SaveChanges;