代码优先自引用外键(多个)

Code first self referencing foreign key (more than one)

我有一个用户实体,它的父实体是 EntityBase class。 父 class 看起来像这样:

public class EntityBase
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        public bool? IsPublic { get; set; }
        public bool? IsActive { get; set; }

        public DateTime CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
        public DateTime? DeletedAt { get; set; }

        public virtual User CreatedBy { get; set; }
        public Guid? CreatedById { get; set; }

        public virtual User UpdatedBy  { get; set; }
        public Guid? UpdatedById { get; set; }

        public virtual User DeletedBy { get; set; }
        public Guid? DeletedById { get; set; }
    }

用户class:

public class User : EntityBase
{
    public string Username { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Token { get; set; }
    public DateTime LastLogin { get; set; }
    public DateTime LastAction { get; set; }
    public bool IsLocked { get; set; }
    public bool IsAdmin { get; set; }

    public virtual ICollection<Cocktail> Cocktails { get; set; }
    public virtual ICollection<Drink> DrinkVotes { get; set; }
    public virtual ICollection<Cocktail> CocktailVotes { get; set; }
}

现在我的自引用有问题,因为存在循环依赖,我该如何解决这个问题?

1) 你的基础实体必须是抽象的

   public abstract class EntityBase ....

2) 移动 child 类 中的 Id 例如 UserId/CoktailId 等(可选但推荐)

4) 使用 InverseProperty 属性引用鸡尾酒 示例:http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

在您的上下文中,您需要重写 OnModelCreating(DbModelBuilder),然后像这样设置关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>()
            .HasOptional(f => f.CreatedBy)
            .WithMany()
            .WillCascadeOnDelete(false);
    modelBuilder.Entity<User>()
            .HasOptional(f => f.UpdatedBy)
            .WithMany()
            .WillCascadeOnDelete(false);
    modelBuilder.Entity<User>()
            .HasOptional(f => f.DeletedBy)
            .WithMany()
            .WillCascadeOnDelete(false);
}

您正在通过

删除此处的循环引用
  1. 声明 CreatedBy、UpdatedBy 和 DeletedBy 关系是可选的
  2. 删除时禁用级联