【问题标题】:Entity Framework: "The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects."实体框架:“无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。”
【发布时间】:2017-12-12 05:54:52
【问题描述】:

我有这段代码(VS2010 ASP.NET MVC 3 和 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 新手)。

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    如果您的 user 变量是实体类型,并且分配给不同的上下文,那么您会遇到此问题。

    我不认为问题出在您的 ProjectProjectUser 对象之间,只是因为您的 ProjectUser 对象没有明确分配给上下文 - 我认为默认情况下它会转到与Project 当你去保存它。

    我相信只有当您真正拥有两个上下文并尝试将它们连接在一起时才会出现此错误。

    【讨论】:

    • 你是对的!我以为问题出在 Project 和 ProjectUser 之间,但问题确实出在 User 上。非常感谢!
    【解决方案2】:

    只需列出您为 Project 所做的事情,您需要将 ProjectUser 添加到上下文中。所以模仿这条线:

    context.AddObject(project);
    

    然后去做

    context.AddObject(projectUser);
    

    并在将其添加到项目集合之前执行此操作。

    【讨论】:

    • 我试过了,但它显示“无法将具有临时 EntityKey 值的对象附加到对象上下文。”当我在“project.ProjectUsers.Add(projectUser)”行之前添加“context.AddObject(projectUser)”行时。
    【解决方案3】:

    你根本不需要这条线:

    project.ProjectUsers.Add(projectUser);
    

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

    context.AddObject(project);
    

    【讨论】:

    • 我想我真的需要那条线......否则,项目和项目用户之间没有关系。我不明白没有那条线怎么会有关系。
    【解决方案4】:

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

    `

    所以无论您在应用程序的哪个位置,都可以拥有完全相同的实例

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-23
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多