0

我有以下表结构:

Affiliations

Id    Party1    Party2
1     100       200
2     300       400

以及通过 FKs of Affiliations引用的表格

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"));

派对实体将左右关系映射到它们各自的属性LeftPartyAffiliationsRightPartyAffiliations。通过定义上述规则,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);

它将模型类中的属性映射到数据库中的外键列。此处必须禁用级联删除(至少对于两个关系之一),否则您将拥有一个在 SQL Server 中被禁止的多个级联删除Party路径PartyAffiliation

于 2013-02-12T17:45:13.113 回答