且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-02-13 11:01:39

虽然我认为这有点一个黑客,它的作品。我发布这个,希望它帮助别人节省一整天的工作。

While I consider this a bit of a hack, it works. I'm posting this in the hopes that it helps someone else save an entire day's worth of work.

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