实体框架 4.3 - 代码优先 - 更新列表属性

本文关键字:更新 列表 属性 代码 框架 实体 | 更新日期: 2023-09-27 18:35:30

作为我之前问题的后续,我现在知道 EF 不只是自动为我保存整个实体的所有更改。如果我的实体有一个 List,我需要更新该列表并保存它。但是怎么做呢?我已经尝试了一些方法,但我无法正确保存列表。

我在应用程序和自定义变量组之间有一个多对多关联。一个应用可以有一个或多个组,一个组可以属于一个或多个应用。我相信我已经在我的 Code First 实现中正确设置了此设置,因为我在数据库中看到了多对多关联表。

底线是应用程序类有一个List。我的简单情况是该应用程序已经存在,现在用户已选择一个组属于该应用程序。我想将该更改保存在数据库中。

尝试 #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 更新应用程序的列表。应该怎么做?

编辑(解决方案)

经过数小时的反复试验,这似乎正在起作用。看来我需要从数据库中获取对象,修改它们,然后保存它们。

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.3 - 代码优先 - 更新列表属性

虽然我认为这有点黑客,但它有效。我发布这篇文章是希望它能帮助其他人节省一整天的工作。

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;
}