如何在实体框架模型中引用用户对象?



我有以下模型:

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();

相关内容

  • 没有找到相关文章

最新更新