2016-06-15 70 views
2

我有一個用戶實體,其EntityBase作爲父類。 父類看起來是這樣的:代碼第一次自引用外鍵(多於一個)

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

用戶等級:

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

1)你的基礎機構必須是抽象的

public abstract class EntityBase .... 

2)將標識在例如用戶名/ CoktailId等子類(可選但建議)

4)使用InverseProperty屬性來引用雞尾酒 例如:http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

+0

  • 禁用級聯我想將外國的id在entityBase ... – thierryiseli

  • +0

    您可以將其保留在基類上,並且您必須手動配置它。想想用例:EntityA從Baseclass繼承而EntityB從EntityA繼承?基類中的Id將用於EntityA或EntityB。相信我很多其他使用案例會讓你頭痛,我建議你只是保持簡單並將其降低。 –

    +0

    第二個使用案例想想如果你想創建一個一對一的關係你gona做什麼?你的ID必須是! DatabaseGeneratedOption.None !!!!所以你再次使用技巧來解決問題 –

    1

    在你的情況下,你需要重寫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關係在這裏除去循環引用是可選上刪除
    +0

    它仍然不起作用... – thierryiseli