我有以下模型:
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();
但是,该代码会引发以下错误:
一个实体对象不能被多个 IEntityChangeTracker 实例引用。
我从该错误消息中收集到CurrentUser
仍然由支持ApplicationUserManager
的数据库上下文管理,因此我无法将其添加到其他上下文中。但与我发现的其他记录情况不同,我不能简单地切换上下文以便它们共享数据库连接:用户对象来自ApplicationUserManager
。我需要做什么来解决这个问题?我做错了什么根本性的事情吗?我知道我可以改用 ID 并查找相应的用户,但我宁愿直接访问该对象。
您的问题与您发布的链接中发现的问题非常相似。简而言之,您无法从不同的上下文中操作用户。这里:
ApplicationUser currentUser = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
您有效地从System.Web.HttpContext.Current.GetOwinContext()
中获取了currentUser
,但是您尝试使用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();