0

以前の質問のフォローアップとして、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();
}
4

1 に答える 1

0

これはちょっとしたハックだと思いますが、うまくいきます。他の誰かが一日の仕事の価値を節約するのに役立つことを願ってこれを投稿しています。

public void Save(Application incomingApp)
{
    if (incomingApp == null) { throw new ArgumentNullException("incomingApp"); }

    int[] groupIds = GetGroupIds(incomingApp);

    Application appToSave;

    if (incomingApp.IdForEf == 0)  // New app
    {
        appToSave = incomingApp;
        // Clear groups, otherwise new groups will be added to the groups table.
        appToSave.CustomVariableGroups.Clear();
        this.Database.Applications.Add(appToSave);                
    }
    else
    {
        appToSave = this.Database.Applications
                .Include(x => x.CustomVariableGroups)
                .Single(x => x.IdForEf == incomingApp.IdForEf);
    }

    AddGroupsToApp(groupIds, appToSave);
    this.Database.SaveChanges();
}

private void AddGroupsToApp(int[] groupIds, Application app)
{
    app.CustomVariableGroups.Clear();

    List<CustomVariableGroup> groupsFromDb2 =
        this.Database.CustomVariableGroups.Where(g => groupIds.Contains(g.IdForEf)).ToList();

    foreach (CustomVariableGroup group in groupsFromDb2)
    {
        app.CustomVariableGroups.Add(group);
    }
}

private static int[] GetGroupIds(Application application)
{
    int[] groupIds = new int[application.CustomVariableGroups.Count];

    int i = 0;
    foreach (CustomVariableGroup group in application.CustomVariableGroups)
    {
        groupIds[i] = group.IdForEf;
        i++;
    }

    return groupIds;
}
于 2012-05-29T01:09:35.063 に答える