保存数据库更改时,对象将丢失对另一个的引用

时间:2015-02-02 09:16:27

标签: c# asp.net asp.net-mvc entity-framework

所以这是一个稍微不正统的问题,因为我没有做过适当的研究,但这主要是因为这个错误让我感到困惑,以至于我不知道如何以某种方式表达它这实际上是在谷歌搜索点击。所以,简单地说:

问题背景:
我在Code-First ASP.NET MVC / Web项目中有多对多的关系。一个模型是用户,而另一个是项目。根据Code-First中的多对多关系,项目具有称为用户的ICollection(实例化为列表),用户具有称为项目的ICollection(也是列表)。此外,project有一个名为owner的用户元素,只有该元素中引用的用户才有权将其他用户添加到项目中。对于所有者,拥有的项目只是该集合中的另一个成员。

问题:
在将用户添加到项目并将项目添加到用户的控制器中,将调用以下行:

        project.users.Add(user);
        db.Entry(project).State = EntityState.Modified;
        user.Projects.Add(project);
        db.Entry(user).State = EntityState.Modified;

        Owner.Projects.Add(project); // My current bubblegum solution to the problem

        db.SaveChanges();
        // Here is where the problem happens
        return RedirectToAction("Details", new { id = id });

基本上,当上下文保存数据库中的更改时,所有者对其项目列表中项目的引用将消失"。同样,当逐步执行该函数时,所有者在调用db.SaveChanges()之前仍然具有引用,但是当代码到达return语句时它不再存在。

我现在的#34; bubblegum"解决方案有效,我不相信它足以让它留在那里。我想知道这是怎么发生的,为什么会发生这种情况,最重要的是,如何修复它。所以,如果有人知道,或者有人提出想法如何有效地向谷歌进行语言表达,那就请开火。

修改
开始怀疑和检查:让我们说user1已添加到项目中,并且所有者将user2添加到它。在这种情况下,似乎用户1也失去了对项目的引用,这意味着我的" bubblegum"甚至没有工作。 Project保留对用户的引用,但用户将丢失对项目的引用。

编辑2:
根据请求,模型中的集合条目。首先,用户模型中的条目:

public virtual ICollection<Project> Projects { get; set; }

项目模型中的条目:

public virtual ICollection<BuildieUser> users { get; set; }

BuildieUser是扩展IdentityUser模型的模型的名称,以及我使用的模型。希望这能为这种情况带来更多启示。

先谢谢你们,并提出最好的问候 Xevas

1 个答案:

答案 0 :(得分:0)

我必须感谢haim770和他/她的评论,即使我第一次误读它(这就是为什么我的第二次编辑是它的原因)。在重新阅读并思考了一下之后,它让我想到了我创建上下文的文件,更重要的是模型构建器。

似乎我忘了将以下代码段添加到OnModelBuilding方法中:

modelBuilder.Entity<BuildieUser>().HasMany(p => p.Projects).WithMany(u => u.users)
            .Map(u => u.MapRightKey("Project_Id").MapLeftKey("User_Id")
            .ToTable("BuildieUserProject"));

添加后,代码似乎没有任何障碍。所以,谢谢你,海姆。