我正在使用实体框架创建一个数据库。现在,我的问题是:
我有ASP.NET用户实体(ApplicationUser
)。我还有另一个用户实体(LynxUser
)。它们之间的关系是:每个ApplicationUser
可以开立一个或多个LynxUser
帐户。每个ApplicationUser
必须同时登录到其中一个且仅登录一个。注册ApplicationUser
帐户时,也会注册LynxUser
。我不需要担心LynxUser
帐户的安全性,唯一的要求是ApplicationUser
只能使用自己的帐户。
我很难以EF喜欢的方式对此进行建模。现在,我的代码看起来像(为了简洁而编辑):
public class ApplicationUser : IdentityUser {
[Display(Name = "Active User", AutoGenerateField = false), InverseProperty("SelecterUser")]
public LynxUser ActiveUser { get; set; }
[InverseProperty("ApplicationUser")]
public ICollection<LynxUser> LynxUsers { get; set; }
}
和
public class LynxUser {
[Key, Display(Name = "User name", AutoGenerateField = true), StringLength(50, MinimumLength = 1),
Editable(false, AllowInitialValue = true)]
public string Name { get; set; }
[Required, Display(Name = "Site User", AutoGenerateField = false), Editable(false, AllowInitialValue = true),
InverseProperty("LynxUsers")]
public virtual ApplicationUser ApplicationUser { get; set; }
/// <summary>
/// This is required to establish a one-to-one transferrable relationship as the active user.
/// </summary>
[Display(Name = "Selecter User", AutoGenerateField = false), InverseProperty("ActiveUser")]
public virtual ApplicationUser SelecterUser { get; set; }
}
问题似乎在于这两个实体之间的递归关系。如何更好地建模?我绝对需要记录每个ApplicationUser
登录的最后一个LynxUser
。
编辑:问题解决了,看看我的答案。
您只需向LynxUser添加一个"IsActive"-布尔标志,并从ApplicationUser中删除ActiveUser。
所以你只需要设置"IsActive"标志。ApplicationUser只知道它有哪些LynxUsers。
我最终添加了另一个实体LynxLogin,它跟踪ApplicationUser
到LynxUser
的登录,以及一个DateTime
。在实际生成新对象并将其写入数据库时,我仍然遇到一些问题(我不得不手动设置db.Entry(user).State = EntityState.Unchanged;
以防止db.SaveChanges()
抱怨用户已经存在。