我有这个代码(带有EF 4的VS2010 ASP.NET MVC 3):
Project project = new Project();
project.Number = number;
project.Name = name;
context.AddObject(project);
ProjectUser projectUser = new ProjectUser();
projectUser.User = user;
projectUser.Status = 1;
project.ProjectUsers.Add(projectUser);
context.SaveChanges(true);
它会生成以下错误(在“project.ProjectUsers.Add(projectUser)”行上)
“无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。”
我不明白为什么原因,据我所知,两个对象都使用相同的ObjectContext(但我是EF的新手)。
我做错了什么? 谢谢你的帮助!
答案 0 :(得分:7)
如果您的user
变量是实体类型,并且它被分配到不同的上下文,那么您将遇到此问题。
我认为问题不在您的Project
和ProjectUser
对象之间,只是因为您的ProjectUser
对象未明确分配给上下文 - 我认为默认情况下它会当你去保存它时,转到与Project
相同的上下文。
我相信只有当你真正有两个上下文并尝试将它们连接在一起时才会出现此错误。
答案 1 :(得分:4)
只需列出您为Project执行的操作,您需要将ProjectUser添加到上下文中。所以模仿这条线:
context.AddObject(project);
反而成为
context.AddObject(projectUser);
在将它添加到项目集合之前,请执行此操作。
答案 2 :(得分:0)
根本不需要这一行:
project.ProjectUsers.Add(projectUser);
只需添加项目即可,因为您正在设置关系。
context.AddObject(project);
答案 3 :(得分:0)
我认为避免此问题的一个好方法是将application
database
上下文实现为singleton
。以下是您的示例:
在这里ApplicationDbContext.cs
`的java
public class ApplicationDbContext : DbContext, IDbContextFactory<DbContext>
{
protected static ApplicationDbContext _instance { private set; get; }
private ApplicationDbContext() : base("ApplicationDbContext")
{
}
public DbContext Create()
{
return getInstance();
}
public static ApplicationDbContext getInstance()
{
if (_instance == null) {
_instance = new ApplicationDbContext();
}
return _instance;
}
}
`
这是你的控制器 `的java
private ApplicationDbContext _db;
public class HelloController : Controller
{
_db = ApplicationDbContext.getInstance();
}
`
因此,无论您在app app中的哪个位置,都可以拥有完全相同的实例
答案 4 :(得分:0)
我知道这已经过时了,但我今天花了几个小时对这个无益的错误感到沮丧,而巴巴卡的回答终于指出了我正确的方向。
Ninject管理依赖项,我需要指定
kernel.Bind<Context>().ToSelf().InSingletonScope();
在UserManager和各种控制器之间的EF调用开始表现正常之前。