【问题标题】:Entity Framework Many to many data not persisting实体框架多对多数据不持久
【发布时间】:2017-12-07 15:05:56
【问题描述】:

我对实体框架有奇怪的问题。我正在尝试更新我的实体User,它与Team 具有多对多关系。当我尝试向用户添加一些团队(存在于数据库中)时,数据库中没有任何变化。但是,当我从用户中删除所有团队时,它会保留到数据库并且用户没有任何团队。为什么添加不持久?有什么想法吗?

  public int Save(User entity)
    {
        using (var context = new UsersContext())
        {
                var teamIds = entity.Teams.Select(t => t.Id).ToArray();
                context.Entry(entity).State = EntityState.Modified;
                context.Entry(entity).Collection(u => u.Teams).Load();
                entity.Teams.Clear();
                foreach (var teamId in teamIds)
                {
                    entity.Teams.Add(context.Teams.Find(teamId));
                }

            return context.SaveChanges();
        }
    }

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    问题是,当您调用context.Entry(entity).State = EntityState.Modified; 时,引用的Team 条目将被设置为State = EntityState.Unchanged,集合将不会被识别为已修改,EF 将忽略通过以下方式获取实际数据库值的尝试context.Entry(entity).Collection(u => u.Teams).Load(); 并且它也不会通过 clear 和 re-add 识别更改,因为 context.Teams.Find(teamId) 将返回已经标记为未更改的本地条目,并且最后的集合将包含与最初相同的数据。

    可能的解决方案:在设置状态修改之前清除集合,然后从数据库中加载集合并在重新添加项目之前再次清除:

    using (var context = new DbC())
    {
        var teamIds = entity.Teams.Select(t => t.Id).ToArray();
        entity.Teams.Clear();
        context.Entry(entity).State = EntityState.Modified;
        context.Entry(entity).Collection(u => u.Teams).Load();
        entity.Teams.Clear();
        foreach (var teamId in teamIds)
        {
            entity.Teams.Add(context.Teams.Find(teamId));
        }
        return context.SaveChanges();
    }
    

    看到这里有一个有点相似的主题:Updating a reference to a child object in Entity framework 4.1 (CodeFirst) 尽管它是关于单个引用而不是集合,但基本问题是相同的。

    关于Collection(..).Load()的文档引用:

    从数据库加载实体集合。请注意,实体 上下文中已经存在的值不会被数据库中的值覆盖。

    这就是为什么在最初填充集合时加载无法有效获取实际数据库状态的部分原因。

    【讨论】:

    • 这几乎奏效了。为了使其充分发挥作用,我需要在集合加载后再添加一个“entity.Teams.Clear()”。感谢您的帮助。
    • @Crekate 哦,是的,我傻了......我确实测试了我的代码,但我只在现有的基础上添加了更多团队 - 所以在我的情况下没有真正需要清除:O
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多