2017-01-22 6 views
1

У меня есть следующие модели:Как я могу ссылаться на объект пользователя в модели Entity Framework?

public class MyEntity 
{ 
    public Guid Id { get; set; } 
    public virtual ICollection<ApplicationUser> AssociatedUsers { get; set; } 

    public MyEntity() 
    { 
     AssociatedUsers = new HashSet<ApplicationUser>(); 
    } 
} 

Обратите внимание, что каждый объект имеет некоторые связанные с ним пользователей. В моем контроллере, я пытаюсь добавить экземпляр MyEntity в базу данных, как это:

private ApplicationDbContext db = new ApplicationDbContext(); 

// ... 

ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

MyEntity entityInstance = new MyEntity(); 
entityInstance.Id = Guid.NewGuid(); 
entityInstance.AssociatedUsers.Add(currentUser); 
db.MyEntities.Add(entityInstance); 
db.SaveChanges(); 

Однако, этот код выдает следующее сообщение об ошибке:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

я понял из этого сообщения об ошибке, CurrentUser все еще управляется контекстом базы данных, который поддерживает ApplicationUserManager, поэтому я не могу добавить его в другой контекст. Но, в отличие от other cases that I have found documented, я не могу просто переключить контекст так, чтобы они совместно использовали соединение с базой данных: пользовательский объект исходит от ApplicationUserManager. Что мне нужно сделать, чтобы решить эту проблему? Я делаю что-то принципиально неправильно? Я знаю, что вместо этого я мог бы использовать идентификатор и искать соответствующего пользователя, но я предпочел бы, чтобы объект был доступен напрямую.

ответ

1

Ваша проблема очень похожа на проблему, обнаруженную в указанной вами ссылке. В нескольких словах вы не можете манипулировать пользователем из разных контекстов. Здесь:

ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

Вы эффективно получили currentUser от System.Web.HttpContext.Current.GetOwinContext(), но вы пытаетесь сохранить его с помощью db, который является ApplicationDbContext.

Держите его на том же контексте, и у вас будет ваша проблема решена:

var currentUser = db.Users.Find(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

var entityInstance = new MyEntity(); 

entityInstance.Id = Guid.NewGuid(); 

entityInstance.AssociatedUsers.Add(currentUser); 
db.MyEntities.Add(entityInstance); 
db.SaveChanges(); 

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

  • Нет связанных вопросов^_^