实体框架:无法定义两个对象之间的关系,因为它们附加在不同的ObjectContext对象上

本文关键字:对象 因为 ObjectContext 关系 之间 框架 定义 两个 实体 | 更新日期: 2023-09-27 18:02:22

我有这个代码(VS2010 ASP。. NET MVC 3 with EF 4):

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的新手)。

我做错了什么?谢谢你的帮助!

实体框架:无法定义两个对象之间的关系,因为它们附加在不同的ObjectContext对象上

如果您的user变量是一个实体类型,并且它被分配到一个不同的上下文中,那么您就会遇到这个问题。

我不认为问题是在你的ProjectProjectUser对象之间,只是因为你的ProjectUser对象没有明确地分配给一个上下文-我认为默认情况下,当你去保存它时,它将与Project相同的上下文。

我相信只有当你真的有两个上下文并试图将它们连接在一起时,你才会得到这个错误。

就像您为Project所做的那样,您需要将ProjectUser添加到上下文中。所以模仿这行:

context.AddObject(project);

改成

context.AddObject(projectUser);

在你把它添加到项目的集合之前做这个

你根本不需要这一行:

project.ProjectUsers.Add(projectUser);

只要添加项目就足够了,因为您正在设置关系。

context.AddObject(project);

我认为避免这个问题的一个好方法是实现您的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();
}

所以无论你在应用程序的哪个位置

你都可以使用相同的实例

我知道这已经过时了,但是今天我花了几个小时为这个毫无帮助的错误感到沮丧,Babacar的回答最终为我指明了正确的方向。

使用Ninject管理依赖,我需要指定

kernel.Bind<Context>().ToSelf().InSingletonScope();

在UserManager和各种控制器之间的EF调用开始正常运行之前

相关文章: