2017-01-09 123 views
1

我需要使用實體框架在多個數據表上實現實體 - 屬性 - 值功能。比方說,我有一個屬性值EF類,看起來像這樣:實體框架外鍵到多個表/實體

public class EntityAttributeValue 
{ 
    // Not important to my question. 
    public virtual Entity ParentEntity { get; set; } 
    public virtual EntityAttribute ParentEntityAttribute { get; set; } 

    // Field in question. 
    public Guid ParentSurrogateKey { get; set; } 

    public string Value { get; set; } 

    ... 
} 

然後我有與它們相關的補充EAV值的多個實體:

public class Entity1 
{ 
    // Key. EntityAttributeBalue.ParentSurrogateKey maps to this. 
    [Key] 
    public Guid SurrogateKey { get; set; } 

    // Standard properties. 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 

    // Collection of EAV values associated with this entity/table. 
    [ForeignKey("ParentSurrogateKey")] 
    public virtual IList<EntityAttributeValue> EntityAttributeValues { get; set; } 
} 

public class Entity2 
{ 
    // Key. EntityAttributeBalue.ParentSurrogateKey maps to this. 
    [Key] 
    public Guid SurrogateKey { get; set; } 

    // Standard properties. 
    public string OtherProperty1 { get; set; } 
    public string OtherProperty2 { get; set; } 

    // Collection of EAV values associated with this entity/table. 
    [ForeignKey("ParentSurrogateKey")] 
    public virtual IList<EntityAttributeValue> EntityAttributeValues { get; set; } 
} 

我的問題是,無論是使用實體和ENTITY2具有與它們相關聯的EntityAttributeValue對象。代碼第一次遷移嘗試從EntityAttributeValue創建一個外鍵返回到Entity1,另一個返回到ParentSurrogateKey上的Entity2。任何單個給定EntityAttributeValue的代理鍵只與一個Entity1或一個Entity2(或擴展出來,一個EntityN ...)相關聯,而不是全部。

我在這裏有多對多的關係,但一方不僅映射到多行,而且映射到共享GUID列上的多個實體/表。

我應該如何處理這個問題?我是否應該從自動遷移中將EntityAttributeValue外鍵移回Entity1和Entity2(這將是一個長期的痛苦)?我應該手動檢索給定EAV實體的EntityAttributeValues列表,而不是依靠EF來爲我做?

+1

我認爲這是一個基本的EF新手問題。如果實際上將它設置爲多對多,則自動創建的連接表將處理這種情況。我以爲我曾嘗試過,但顯然不是。如果這個成功發揮,我會回答我自己的問題。 –

回答

1

那麼,答案是明顯而簡單的。我需要定義與FluentAPI的多對多關係。在OnModelCreating,我只是說:

  modelBuilder.Entity<Entity1>() 
       .HasMany(m => m.EntityAttributeValues) 
       .WithMany(); 

      modelBuilder.Entity<Entity2>() 
       .HasMany(m => m.EntityAttributeValues) 
       .WithMany(); 

我以爲我已經試過了,但我想我沒有。由於多對多關係會爲每個實體創建一箇中間表,並且外鍵位於該中間表上(並且在給定EntityAttributeValue應用於給定實體時,中間表中只有一行),則不會出現外鍵問題。

+0

我混亂的一個原因是,對於給定的EntityAttributeValues對象,總是隻有一個EntityN對象。但是,由於不同的EntityAttributeValues實例可以映射到EntityN對象的不同類型(類),因此表示多到多的關係是避免問題的權宜之計。也許這種策略有一些潛力可以被看作是「笨蛋」。 –