0

次のテーブル構造があります。

Affiliations

Id    Party1    Party2
1     100       200
2     300       400

そして、アフィリエーションの FK を通じて参照されるテーブル

Parties

Id    Name
100   Hank
200   Ted
300   Kim
400   Joe

Party エンティティ (図示せず) を使用して、Fluent API を使用してテーブル間の関係を定義します。

modelBuilder.Entity<Party>()
            .HasMany(c => c.LeftPartyAffiliations)
            .WithRequired()
            .Map(m => m.MapKey("Party1"));

modelBuilder.Entity<Party>()
            .HasMany(c => c.RightPartyAffiliations)
            .WithRequired()
            .Map(m => m.MapKey("Party2"));

パーティ エンティティは、左右の関係をそれぞれのプロパティLeftPartyAffiliationsおよびRightPartyAffiliationsにマップします。上記のルールを定義することで、EF は自動的にParty1Party2を Affiliations テーブルに追加します。

私の問題は、各所属の値が正しくマップされている一方で、パーティの関係を通じてこれらのテーブルを自分の列にマッピングしているため、左側と右側の所属 ID を知る方法がないという事実にあります。

たとえば、所属エンティティを介して実際の Party1 および Party2 ID にアクセスできるようにしたいと考えています。

public class PartyAffiliation
{
    ...

    [Column("Party1")]
    public int Party1 { get; set; }

    [Column("Party2")]
    public int Party2 { get; set; }

    ...
}

...しかし、Fluent API を介して Party から Left および Right コレクションにマッピングすることで、既に関係を定義しているため、これは不可能です。

完璧な状況では、Fluent API マッピングを実行できます。これにより、列と関係が作成され、所属マッピングで定義された物理列を介して Party1 および Party2 ID にアクセスできるようになります。

エンティティと Fluent API でプロパティを物理的に定義しようとすると、次のようになります。

型の各プロパティ名は一意である必要があります。プロパティ名はすでに定義されています 'xxx'

この問題の回避策、またはデータベースにフィールドを物理的に追加せずに列を複数のプロパティにマッピングする方法はありますか?

4

1 に答える 1

1

HasForeignKey代わりに使用できますMapKey

modelBuilder.Entity<Party>()
    .HasMany(c => c.LeftPartyAffiliations)
    .WithRequired()
    .HasForeignKey(pa => pa.Party1)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Party>()
    .HasMany(c => c.RightPartyAffiliations)
    .WithRequired()
    .HasForeignKey(pa => pa.Party2)
    .WillCascadeOnDelete(false);

モデル クラスのプロパティをデータベースの外部キー列にマップします。ここではカスケード削除を無効にする必要があります (少なくとも 2 つの関係の 1 つに対して)。そうしないと、SQL Server で禁止されPartyている複数のカスケード削除パスが作成されます。PartyAffiliation

于 2013-02-12T17:45:13.113 に答える