【发布时间】:2017-09-06 00:59:17
【问题描述】:
我在 ASP.NET MVC 中更新与应用程序用户相关的实体时遇到问题。我在ApplicationUser 和Order 之间有一对多的关系。这是我的实体和关系配置:
public class ApplicationUser : IdentityUser
{
public virtual ICollection<Order> HandlingOrders { get; set; }
}
public class Order
{
public int Id { get; set; }
//some properties
public string OperatorId { get; set; }
[ForeignKey("OperatorId")]
public virtual ApplicationUser Operator { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ApplicationUser>().HasMany(n => n.HandlingOrders)
.WithOptional(n => n.Operator)
.HasForeignKey(n => n.OperatorId);
}
问题是,当我尝试将Order 保存在我的控制器中时,它会失败并显示InvalidOperationException 和消息
无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。
这是因为一方面我使用“工作单元”和“通用存储库”来保存Order。另一方面,我使用ApplicationUserManager 保存ApplicationUser。
public class OperatorController : Controller
{
private readonly UnitOfWork _unitOfWork;
private ApplicationUserManager _userManager
{
get { return HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
}
结果我得到两个上下文:第一个是来自GetOwinContext() 的IOwinContext,第二个是我的常规ApplicationContext,在“工作单元”中创建(或正在创建?)。并且这种上下文会导致异常。
谁能建议我,在这种情况下什么是最好的?我为ApplicationUser写repository而奋斗,但我从未在文章中看到过这样的做法,所以我不确定。
【问题讨论】:
-
从显而易见的开始。 ApplicationUser 是否在一个上下文中(如默认的 IdentityDbContext),Order 是否在另一个上下文中声明,如 ApplicationContext?那会导致你的错误。如果是这样,只需让您的 ApplicationContext 继承自 IdentityDbContext。
-
@SteveGreene 不,我的
ApplicationContext已经继承自IdentityDbContext<TUser>。实际上,我有一个上下文的两个实例是通过两种不同的方式创建的,这会导致错误。问题是我不知道如何与没有ApplicationUserManager的用户合作,据我所知,无法使用ApplicationContext进行初始化。 -
如果您只是引用用户,则不需要 UserManager。例如,
ApplicationUser myUser = context.Users.FirstOrDefault(u => u.Id == myUserId);将获取身份用户。如果您要更改密码等,则需要 UserManager。显示相关的存储库代码。 -
@SteveGreene 它应该类似于that,我认为(最后三个方法中的存根是,因为类必须实现接口)。这应该可以工作,直到我不必更改用户中的某些内容:)
标签: c# asp.net asp.net-mvc entity-framework design-patterns