0

我在數據庫中有三個實體(EntityA,EntityB,EntityC)和它們各自的表(TableA,TableB,TableC)。我也有一個現有的連接表,它有三個ID列(TableA_ID,TableB_ID,TableC_ID)。EF 4.1 Fluent API。如何在使用具有三個id列的現有連接表時映射兩個實體?

MODELS: 
public class EntityA 
{ 
    public Guid EntityA_ID { get; set } 
    ..... 
    // Each EntityA can be associated with 0 or Many EntityB 
    public virtual ICollection<EntityB> EntityBCollection { get; set; } 
} 

public class EntityB 
{ 
    public Guid EntityB_ID { get; set; } 
    ..... 
    // Each EntityB can be associated with 0 or Many EntityA 
    public virtual ICollection<EntityA> EntityACollection { get; set; } 

    // Each EntityB can be assocated with 0 or Many EntityC, 
    // but it becomes 0 or 1 when EntityB is associated with an EntityA 
    public virtual EntityC EntityC { get; set; } 
} 

public class EntityC 
{ 
    public Guid EntityC_ID { get; set; } 
    ...... 
    // Each EntityC an only be associated with a EntityB 
    // an EntityC does not exist on its own 
    public virtual EntityB EntityB { get; set; } 
} 

DATA CONTEXT: 
modelBuilder.Entity<EntityB>() 
       .HasOptional(entityb => entityb.EntityC) 
       .WithRequired(entityc => entityc.EntityB) 
       .Map(map => 
       { 
        map.ToTable("ThreeIDColumnJoinTable").MapKey(new string[]{"EntityA_ID", "EntityB_ID", "EntityC_ID"}); 

       }); 

我不斷收到以下錯誤:

在代碼中,如下實體與

Unable to determine the principal end of an association between the types 'EntityC' and 'EntityB'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

我如何能重新配置數據上下文映射任何想法等等它不會產生一個錯誤,它還會包含ThreeIDColumnJoinTable中指定的EntityA的關係?

+0

難道你沒有連接表條目的實體嗎?另外我認爲你濫用最後一行中的Map方法。此版本僅用於映射外鍵列名稱(請參閱Intellisense中的說明)。 – Slauma 2012-01-16 18:06:27

+0

Slauma,沒有爲連接表創建一個實體,因爲我以前從來沒有必須(爲了直接推進兩列的多對多關係)。此外,「地圖」代碼是我所能想到的所有不同前提下的最後一次嘗試。我會嘗試創建連接表實體以查看還會出現什麼內容。謝謝。 – fuzzlog 2012-01-16 18:44:35

+0

是的,對於多對多連接表,您不需要實體。但是這個表格必須有精確的*兩個*列,這些列形成一個組合鍵,並且是相關表格的FK。沒有其他類型的連接表是被允許的。 – Slauma 2012-01-16 18:49:07

回答

0

// Each EntityB can be assocated with 0 or Many EntityC, but it becomes 0 or 1 when EntityB is associated with an EntityA

在這種情況下,您的EntityB具有錯誤的導航屬性。它應該是:

public class EntityB 
{ 
    public Guid EntityB_ID { get; set; } 
    ..... 
    // Each EntityB can be associated with 0 or Many EntityA 
    public virtual ICollection<EntityA> EntityACollection { get; set; } 

    public virtual ICollection<EntityC> EntityCCollection { get; set; } 
} 

您需要收集EntityC以支持「Many」部分。規則的第二部分不能由數據庫/模型強制執行。它必須由您的應用程序邏輯強制執行。

您的模型的其餘部分可以按原樣使用。刪除流利的映射,你應該得到A和B之間的多對多關係以及B和C之間的一對多關係。這正是你的規則所說的。

對於三個表格來說,沒有什麼像自動多對多的。如果您需要(不是您當前的情況),則必須將聯接表映射爲第四個實體,並將其他三個實體的導航屬性映射到提供關係橋的新實體。

+0

因此,根據您和Slauma迄今爲止提供的信息,似乎如果爲我的表創建模型(包括連接/連接表),然後爲我的Context類中的每個表添加DbSet條目,然後我將相應的導航屬性添加到它們各自的模型中,那麼我將不必使用ModelBuilder.Entity ()的流利API .Map(...)方法嗎?這是一個正確的斷言嗎? – fuzzlog 2012-01-17 21:51:39

+0

我相信你不會需要實體的聯結表,但只需要A,B和C.否則你的理解是正確的。 – 2012-01-17 23:29:27

+0

感謝這兩個增加我的理解。我一直試圖使用.Map(...),因爲這是我在大多數例子中看到的。創建連接表模型並在其他模型中添加正確的導航屬性解決了我的問題。 – fuzzlog 2012-01-18 00:48:37

相關問題