【问题标题】:How to properly model a "selected item" relationship in SQL databases?如何正确建模 SQL 数据库中的“选定项”关系?
【发布时间】:2015-04-20 13:57:09
【问题描述】:

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

我有 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

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

【问题讨论】:

    标签: c# entity-framework data-modeling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以向 LynxUser 添加一个“IsActive” - 布尔标志,然后从 ApplicationUser 中删除 ActiveUser

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

      【讨论】:

      • 我仍然希望保持它易于访问的便利性,并确保每个ApplicationUser 只有一个活动LynxUser。如果没有其他解决方案,我会这样做。
      • 我知道你想要实现什么。但我认为这不应该是您的数据库的任务。你应该自己处理这个。在您的第一个想法中,您还需要自己设置ActiveUser。因此,当活动用户发生变化时,您只需更改所有LynxUsersIsActive 标志
      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多