2017-08-09 6 views
0

私はProjectオブジェクトを持っています。これは多くのネストされたオブジェクトで構成されています。 DBへのこのオブジェクトを保存するにはAutoMapperはChangeTrackerを混乱させます

  • 私は(テストとして)私のプロジェクトの中に一つだけの特性を変更し、私のDALにそれを渡します。
  • 既存のプロジェクトをEFでDBからロードします。
  • 変更したプロジェクトを既存のプロジェクトにマップします。
var existingProject = 
    db.Project.Single(p => p.ID == changedProject.ID).Include(p => p.Something); 

existingProject = Mapper.Map(changedProject, existingProject); 

db.SaveChanges(); 

これは、私が変更トラッカをドリルダウンするとき、私はそれは非常に混乱だ見ることができるので驚くべきことではないnullの外部キーに失敗します。

var added = db.ChangeTracker.Entries().Where(e => e.State == EntityState.Added); 

マッピングが取り後プロジェクト内の膨大な数のオブジェクトは追加されたものとしてマークされます(プロジェクトに何も追加または削除されていなくても、1つのプロパティのみが変更されています)。

AutoMapperはネストされたオブジェクトの新しいインスタンスを作成し、EFはこれをDBの既存のオブジェクトに関連付けることができないためですか?

私はこのアプローチを多くの場所で提案してきましたが、AutoMapperがChangeTrackerと連携して上記を理解できるようにする方法があるのでしょうか?

答えて

1

宛先コレクションが最初にクリアされます。既存のEFコレクションにマップする場合は、AutoMapper.Collectionが必要です。

+0

私はAutoMapper 3.3.1.0を使用していますが、これは有望な感謝のようですので、更新する必要があります。 – FBryant87

+0

これは違いがありましたが、ChangeTrackerの多数のエンティティは以前と同じように 'Added'とは対照的に 'Modified'としてマークされています。それらは変更されていないとマークする必要があります。おそらくEFはマッピングのためにオブジェクトへの変更を認識しますか? – FBryant87

+0

私はSQLをチェックし、そこに問題がある場合はgithubに報告しますが、それ以外の場合はokとしてください。 –

0

これは、マッピングするときに新しいエンティティが作成され、EFコンテキストに情報がないためです。 Updating records using a Repository Pattern with Entity Framework 6

あなたはあなたの「changedProject」にDBからデータをマッピングすることができ、すべての必要な変更は、次の例では(System.Data.EntityState.Modifiedを使用して)のようなメソッド「existingProject」にし、このエンティティコール「更新」のために再度マッピングします
+0

最後に 'changedProject'から 'existingProject'にマップするとき、これは確かに同じ問題を引き起こしますか? (AutoMapperは新しいエンティティを作成します) – FBryant87

+0

はい新しいインスタンスを作成していますが、Updateメソッドはステータスを 'Add'ではなく 'modified'としてコンテキストに再接続しています –

+0

これはすべて変更するように設定されていますか? 5000のうち1つのプロパティだけが変更された場合は、それらはすべて更新されます。 – FBryant87

関連する問題