如何正确建模"所选项目" SQL数据库中的关系?

时间:2015-02-19 09:28:09

标签: c# entity-framework data-modeling

我正在使用Entity Framework创建数据库。现在,我的问题是:

我有ASP.NET用户实体(ApplicationUser)。我还有另一个用户实体(LynxUser)。它们之间的关系是:每个ApplicationUser可以打开一个或多个LynxUser帐户。每个ApplicationUser必须一次只登录一个ApplicationUser。注册LynxUser帐户时,也会注册LynxUser。我不需要担心ApplicationUser帐户的安全性,唯一的要求是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; } } 可能只使用自己的帐户。

我很难以EF喜欢的方式对其进行建模。现在,我的代码看起来像(为简洁而编辑):

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; }

}

LynxUser

问题似乎是这两个实体之间的递归关系。我怎样才能更好地模拟这个?我绝对需要记录登录到的每个ApplicationUser的最后{{1}}。

编辑:问题解决了,请参阅我的回答。

2 个答案:

答案 0 :(得分:1)

您只需向LynxUser添加“IsActive” - 布尔标志,然后从 ApplicationUser 中删除 ActiveUser

所以你只需要设置“IsActive”标志。 ApplicationUser只知道它拥有哪些LynxUsers。

答案 1 :(得分:1)

我最终添加了另一个实体LynxLogin,它跟踪ApplicationUserLynxUser次登录以及DateTime。实际生成新对象并将其写入数据库时​​仍然存在一些问题(我必须手动设置db.Entry(user).State = EntityState.Unchanged;以防止db.SaveChanges()抱怨用户已经存在。