【问题标题】:ASP.NET MVC An entity object cannot be referenced by multiple instances of IEntityChangeTrackerASP.NET MVC 一个实体对象不能被多个 IEntityChangeTracker 实例引用
【发布时间】:2016-04-18 11:06:02
【问题描述】:

这是我的源代码:

       private ApplicationDbContext db = new ApplicationDbContext();
       ......
       var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

        Order newOrder = new Order
        {             
            ApplicationUserId = User.Identity.GetUserId(),
            ApplicationUser = UserManager.FindById(User.Identity.GetUserId()),
            MakeDate = DateTime.Now
        };

        db.Orders.Add(newOrder);
        db.SaveChanges();

我打算将用户信息添加到数据库中,但是,似乎 HttpContext.GetOwinContext().GetUserManager() 也共享相同的 DBContext,这就是为什么我有以下异常:

{"一个实体对象不能被多个IEntityChangeTracker实例引用。"}

一旦我删除了与UserManger相关的代码,就不会抛出异常。

那么如何从数据库中检索用户信息,然后将其保存到 order 表中?还是因为我已经将 userid 保存到 order 表中而导致设计错误?

【问题讨论】:

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


    【解决方案1】:

    tl;dr; 在每个方法中声明db,而不是使用类属性。

    发生此错误是因为您的private ApplicationDbContext db = new ApplicationDbContext(); 是一个类属性。你自己说过:

    HttpContext.GetOwinContext().GetUserManager() 也共享相同的 DBContext

    这就是你的问题

    我建议切换到工作单元模式:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

    另一件事:当你想用 EF 编辑一个对象时,你必须db.Orders.Attach(newOrder),但应该只填写主键。如果对象已被填充,实体框架将无法识别更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多