2009-02-16 102 views
1

實體框架神奇地將下表結構解釋爲多對多關係。實體框架中與代理鍵的多對多關係

table foo (int id) 
table foo_bar (int foo_id, int bar_id) 
table bar (int id) 

但是,如果連接表有任何附加字段,它將被解釋爲兩個一對多關係。

我正在使用連接表具有代理鍵作爲主鍵的數據庫。因爲這個EF將其解釋爲兩個一對多的關係。

table foo (int id) 
table foo_bar (int surrogate_pk, int foo_id, int bar_id) 
table bar (int id) 

是否可以修改EF:s解釋使其成爲模型中的實際多對多關係?可以使用設計師來完成嗎?

回答

1

我認爲這不能用設計師來完成。我不知道是否有辦法在EDMX中手動完成它,但我從未見過它的例子。一種可能的解決方法可能是根本不映射代理鍵。如果你可以在數據庫上生成它,你可能不需要在你的模型中使用它。

+0

代理鍵沒有真正的興趣,所以這將很好地工作。從模型中刪除字段似乎沒有任何區別。它可以被排除在一個更確定的方式或東西? – 2009-02-16 20:55:42

+0

在設計器中刪除代理鍵不會將其從存儲模型中刪除。你必須手動編輯EDMX。 – 2009-02-16 21:29:16

2

這是可能的,但它需要在EDMX文件中進行相當多的手動工作,而且我還沒有能夠使EF使用代理鍵作爲鏈接表上的實際主鍵。您必須使EF使用foo_id和bar_id的組合鍵作爲主鍵。

在您的存儲模型

你要鏈接表的EntityType從

<EntityType Name="foo_bar"> 
    <Key> 
     <PropertyRef Name="surrogate_pk" /> 
    </Key> 
    <Property Name="surrogate_pk" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" /> 
    <Property Name="foo_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
    <Property Name="bar_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
</EntityType> 

改變:

<EntityType Name="foo_bar"> 
    <Key> 
     <PropertyRef Name="foo_id" /> 
     <PropertyRef Name="bar_id" /> 
    </Key> 
    <Property Name="foo_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
    <Property Name="bar_id" Type="int" Nullable="false" StoreGeneratedPattern="None" /> 
</EntityType> 

所以你做代理鍵無形的EF,並告訴它使用兩個外鍵的組合作爲主鍵。

在您的概念模型,你需要有多對多關聯定義:

<Association Name="foo_bar_association"> 
    <End Role="foo" Type="foo" Multiplicity="*" /> 
    <End Role="bar" Type="bar" Multiplicity="*" /> 
</Association> 

,並在您的映射,一個AssociationSetMapping:

<AssociationSetMapping Name="foo_bar_association" TypeName="foo_bar_association" StoreEntitySet="foo_bar"> 
    <EndProperty Name="foo"> 
     <ScalarProperty Name="id" ColumnName="foo_id" /> 
    </EndProperty> 
    <EndProperty Name="bar"> 
     <ScalarProperty Name="id" ColumnName="bar_id" /> 
    </EndProperty> 
</AssociationSetMapping> 

迄今爲止獲得最簡單的方法對,是從數據庫中刪除代理鍵,生成EDMX,然後把這個模型放在你的原始數據庫上。結果將是相同的。 EF並不需要任何代理鍵,這個表在多關聯中是不可見的