以前の質問のフォローアップとして、EFがエンティティ全体のすべての変更を自動的に保存するだけではないことがわかりました。エンティティにList<Foo>がある場合は、そのリストを更新して保存する必要があります。しかし、どのように?いくつか試しましたが、リストを正しく保存できません。
ApplicationとCustomVariableGroupの間には多対多の関連付けがあります。アプリには1つ以上のグループを含めることができ、グループは1つ以上のアプリに属することができます。DBに多対多の関連付けテーブルが表示されるため、CodeFirstの実装でこれを正しく設定できたと思います。
つまり、ApplicationクラスにはList<CustomVariableGroup>があります。私の単純なケースは、アプリがすでに存在し、ユーザーがアプリに属するグループを選択した場合です。その変更をDBに保存したいと思います。
試行#1
this.Database.Entry(application).State = System.Data.EntityState.Modified;
this.Database.SaveChanges();
結果:関連付けテーブルにはまだ行がありません。
試行#2
this.Database.Applications.Attach(application);
var entry = this.Database.Entry(application);
entry.CurrentValues.SetValues(application);
this.Database.SaveChanges();
結果:関連付けテーブルにはまだ行がありません。
試行#3
CustomVariableGroup group = application.CustomVariableGroups[0];
application.CustomVariableGroups.Clear();
application.CustomVariableGroups.Add(group);
this.Database.SaveChanges();
結果:関連付けテーブルにはまだ行がありません。
私はかなりの調査を行い、これまでに示した以上のことを試しましたが、アプリケーションのリストを新しいCustomVariableGroupで更新する方法がわかりません。それはどのように行われるべきですか?
編集(解決策)
何時間もの試行錯誤の末、これは機能しているようです。DBからオブジェクトを取得し、変更してから保存する必要があるようです。
public void Save(Application application)
{
Application appFromDb = this.Database.Applications.Single(
x => x.Id == application.Id);
CustomVariableGroup groupFromDb = this.Database.CustomVariableGroups.Single(
x => x.Id == 1);
appFromDb.CustomVariableGroups.Add(groupFromDb);
this.Database.SaveChanges();
}