2016-04-18 4 views
0

Вот мой исходный код:ASP.NET MVC Объект объект не может ссылаться несколько экземпляров IEntityChangeTracker

 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, исключение не будет выбрано.

Так как я могу получить информацию о пользователе из БД, а затем сохранить ее в таблице ? Или дизайн неправильный, потому что я уже сохранил userid в заказать стол?

ответ

0

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), но должны быть заполнены только первичные ключи. Если объект уже заполнен, инфраструктура сущности не будет распознавать изменения.

Смежные вопросы