可能ですが、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 から見えないようにし、2 つの外部キーの組み合わせを主キーとして使用するように指示します。
概念モデルでは、多対多の関連付けを定義する必要があります。
<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 を生成してから、このモデルを元の DB に配置することです。結果は同じになります。EF は実際には代理キーを必要としません。多対多の関連付けではテーブルは見えません。