EF Code First通过DataAnnotations或流畅的API进行自我评级

时间:2017-12-05 22:30:27

标签: c# entity-framework ef-code-first

我有一节课:

[Table(nameof(User), Schema = "Administration")]
public class User : IBaseModel
{
    [Key]
    public int UserId { get; set; }

    #region IBaseModel

    public int AddedBy { get; set; }
    [ForeignKey("AddedBy")]
    public virtual User UserAddedBy { get; set; }

    public int ModifiedBy { get; set; }
    [ForeignKey("ModifiedBy")]
    public virtual User UserModifiedBy { get; set; }

    #endregion
}

我尝试为这个表创建自我关系(谁AddedBy和谁是ModifiedBy项目)

当我的课程如上所示,我尝试在Package Manager Console上使用Add-Migration init时会返回错误:

  

无法确定之间关联的主要结束   类型' abc.Administration.User'和' abc.Administration.User'。   必须明确配置此关联的主要结尾   使用关系流畅的API或数据注释。

发生此错误后,我尝试使用流畅的API和方法OnModelCreating(在我的上下文中)我写道:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Administration.User>().HasOptional(e => e.UserAddedBy).WithMany().HasForeignKey(m => m.AddedBy);
        modelBuilder.Entity<Administration.User>().HasOptional(e => e.UserModifiedBy).WithMany().HasForeignKey(m => m.ModifiedBy);
    }

再次尝试Add-Migration init,但我再次看到错误消息:

  

在模型生成期间检测到一个或多个验证错误:

     

abc.User_UserAddedBy ::多重性与参照冲突   角色&#39; User_UserAddedBy_Target&#39;中的约束谈恋爱   &#39; User_UserAddedBy&#39 ;.因为Dependent中的所有属性   角色不可为空,主要角色的多样性必须为“1”。   abc.User_UserModifiedBy ::多重性与参照冲突   角色&#39; User_UserModifiedBy_Target&#39;中的约束谈恋爱   &#39; User_UserModifiedBy&#39 ;.因为Dependent中的所有属性   角色是不可空的,主要角色的多样性必须是&#39;。

我找到了在虚拟身份之前添加Required属性的信息,但它没有帮助。

2 个答案:

答案 0 :(得分:2)

  

因为从属角色中的所有属性都是不可为空的,   主要角色的多样性必须是&#39; 1&#39;。

尝试使用int?代替int

答案 1 :(得分:1)

根据提供的说明,您可以执行以下操作:

  1. 禁用强制外键(FK)
  2. 添加一个虚拟用户,你可以使用像“System”这样的名字,给它一个像-1这样的不可能的id。
  3. 使系统成为自己的UserAddedBy和UserModifiedBy
  4. 启用强制执行FK。 现在,您可以添加使用System作为UserModifiedBy和UserAddedBy的用户。
  5. 这样,用户中唯一的“被骗”将是系统,在我看来,这是一个很好的权衡。