多対多のエンティティを既存のエンティティに追加するたびにEFに変更を保存させることができないため、私は約2日間髪を引っ張っています。
私の構造は単純です:
と呼ばれるテーブル
Person
があり、ID(Primary、identity)、およびその他のいくつかの文字列フィールドがありますKeyword
ID(Primary、identity)と呼ばれる文字列フィールドと呼ばれるテーブルValue
および
PersonKeywordRelation
、、、PersonId
およびKeywordId
フィールド
エンティティを生成すると(データベースを最初に)、期待どおりに機能Person
する-allgoodのクラスを取得しICollection<Keyword>
ます。
Person
キーワードのリストを変更して既存のを保存しようとすると、問題が発生します。キーワードではなく、スカラープロパティ(文字列)のみが保存されます!
- 遅延読み込みを無効にしてみましたが、効果はありません。
- データベースから個々のキーワードを再度ロードしてみましたが、効果はありませんでした。
- すべてのキーワードをコンテキストにロードして、EFが変更を検出するのに役立つかどうかを確認しましたが、そうではありませんでした。
この問題を抱えているのは私だけではないと確信しています(実際、同じテーマについて、ここですでにいくつかの質問を見たので、完全に確信していますが、実用的な答えを見つけることができません。 ..)、主に古いバージョンのEFの場合、これは私がさらに別の質問を始めた理由のもう1つの理由です:この問題に対処するものは何も変更されていませんか?
これが、人の更新(および作成)を行う私のコードです。それに応じてEF保存の変更を行う私の試みに気付くでしょう。
public void SavePersons(IList<Person> persons)
{
// Create a EF Context
using (var ctx = new MyDbEntities())
{
foreach (var person in persons)
{
// Attach
ctx.Persons.Attach(person);
// Insert or update?
ctx.Entry(person).State = person.Id == 0 ? EntityState.Added : EntityState.Modified;
// Get current keywords before clearing from entity
var keywords = new List<Keyword>(person.Keywords);
// Clear keywords from entity, so we can add fresh ones, hopefully
// EF will have an easier time handling this..
person.Keywords.Clear();
// Add keywords
keywords.ForEach(kw =>
{
ctx.Keywords.Attach(kw);
ctx.Entry(kw).State = EntityState.Modified;
person.Keywords.Add(kw);
});
}
// Save
ctx.SaveChanges();
}
}