1

Entity Framework は、魔法のように次のテーブル構造を多対多の関係として解釈します。

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

ただし、結合テーブルに追加のフィールドがある場合は、代わりに 2 つの 1 対多の関係として解釈されます。

結合テーブルが主キーとして代理キーを持つデータベースを使用しています。このため、EF はそれを 2 つの一対多の関係として解釈します。

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

EF:s の解釈を変更して、モデル内で実際の多対多の関係にすることは可能ですか? デザイナーを使用して行うことはできますか?

4

2 に答える 2

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 から見えないようにし、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 は実際には代理キーを必要としません。多対多の関連付けではテーブルは見えません。

于 2011-01-04T20:15:59.253 に答える
1

デザイナーを使用してこれを行うことはできないと確信しています。EDMX で手動で行う方法があるかどうかはわかりませんが、その例を見たことはありません。考えられる回避策の 1 つは、代理キーをまったくマップしないことです。データベースでそれを生成できる場合、モデルでは必要ないかもしれません。

于 2009-02-16T20:47:47.280 に答える