如何正确建模SQL数据库中的"selected item"关系?



我正在使用实体框架创建一个数据库。现在,我的问题是:

我有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,它跟踪ApplicationUserLynxUser的登录,以及一个DateTime。在实际生成新对象并将其写入数据库时,我仍然遇到一些问题(我不得不手动设置db.Entry(user).State = EntityState.Unchanged;以防止db.SaveChanges()抱怨用户已经存在。

最新更新