6

私のコードでは、その を使用して をロードし、次にを使用してコンテンツを更新し、最後に を呼び出します。しかし、それは機能していません! . しかし、プロパティを手動設定すると有効になります! なにが問題ですか ?entityidAutoMapperContext.SaveChanges

var entity = Context.MyEntities.Find(id);

entity = Mapper.Map<MyEntity>(viewModel);

Context.SaveChanges;

しかし、これは機能します:

var entity = Context.MyEntities.Find(id);

entity.SomeProp = viewModel.SomeProp;

Context.SaveChanges;
4

1 に答える 1

12

次に、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;
于 2012-11-23T12:37:08.883 に答える