所以这是一个稍微不正统的问题,因为我没有做过适当的研究,但这主要是因为这个错误让我感到困惑,以至于我不知道如何以某种方式表达它这实际上是在谷歌搜索点击。所以,简单地说:
问题背景:
我在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
答案 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"));
添加后,代码似乎没有任何障碍。所以,谢谢你,海姆。