C# EF 5代码优先播种自参考表

C# EF 5代码优先播种自参考表,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,这是我的密码: 基类: public class BaseEnt { [Key] public int ID { get;set; } public DateTime InsertDate { get; set; } public int InsertUserID { get; set; } public DateTime UpdateDate { get; set; } public int UpdateUserID { get; set; }

这是我的密码:

基类:

public class BaseEnt
{
    [Key]
    public int ID { get;set; }
    public DateTime InsertDate { get; set; }

    public int InsertUserID { get; set; }
    public DateTime UpdateDate { get; set; }
    public int UpdateUserID { get; set; }
    [Timestamp]
    public byte[] Timestamp { get; set; }

    public virtual User InsertUser { get; set; }
    public virtual User UpdateUser { get; set; }
}
用户实体:

public class User:BaseEnt
{
    public string Username { get; set; }
    public string Fullname { get; set; }

    public virtual ICollection<User> InsertedUsers { get; set; }
    public virtual ICollection<User> UpdatedUsers { get; set; }

}
下面是我在种子部分遇到的错误:


{“无法确定依赖操作的有效顺序。依赖可能由于外键约束、模型要求或存储生成的值而存在。”}

这里存在某种“鸡和蛋”问题。可能的解决办法:

  • 使外键
    InsertUserID
    UpdateUserID
    可为空
  • 做一个设计更改:也许用户表不应该有InsertUserID,UpdateUserID。这可以通过引入另一个基类来解决,该基类没有
    InsertUserID
    UpdateUserID
    属性或类似属性

您具有循环依赖关系。参考此链接您面临的问题是循环引用,因为您尝试添加的用户已经引用了自身。但是此设计在数据库优先中做得很好。在代码优先中真的不可行吗?这怎么可能?您有一个具有ID的表和一个称为InsertUserID和UpdateUserID的自引用列。当表为空时,如何插入新记录?我现在知道了,可能是在创建关系之前插入了第一行。
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
                     .HasRequired(t => t.InsertUser)
                     .WithMany(t=>t.InsertedUsers)
                     .HasForeignKey(t => t.InsertUserID).WillCascadeOnDelete(false);
        modelBuilder.Entity<User>()
                     .HasRequired(t => t.UpdateUser)
                     .WithMany(t=>t.UpdatedUsers)
                     .HasForeignKey(t => t.UpdateUserID).WillCascadeOnDelete(false);

    }
    protected override void Seed(MCFDataContext context)
    {
        context.Users.Add(new Entities.User {ID=1,Fullname="Rusty Boi ",Username="jhaskdhaksdhk",InsertUserID=1,UpdateUserID=1,UpdateDate=DateTime.Now,InsertDate=DateTime.Now });

    }