在映射期间将外键作为属性公开的冲突

时间:2013-02-12 14:43:23

标签: c# ef-code-first entity-framework-5 fluent-interface

我有以下表结构:

Affiliations

Id    Party1    Party2
1     100       200
2     300       400

通过 Affiliations

的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会自动将 Party1 Party2 添加到我的Affiliations表中。

我的问题在于,虽然每个联盟中的值都正确映射,但我没有办法知道左侧和右侧的联属ID,因为我将这些表映射到我的我的党派关系中的专栏。

例如,我希望能够通过我的Affiliation实体访问实际的Party1和Party2 Id:

public class PartyAffiliation
{
    ...

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

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

    ...
}

...但这是不可能的,因为我已经通过映射到我的左右集合,从Party,通过Fluent API来定义我的关系。

一个完美的situtation允许我进行Fluent API映射,这将创建列和关系,并允许我通过我的Affiliation映射中定义的物理列访问我的Party1和Party2 Id。

如果我尝试在实体和Fluent API中以物理方式定义属性,我会得到:

  

类型中的每个属性名称必须是唯一的。物业名称已经存在   定义'xxx'

是否有解决此问题的方法或将列映射到多个属性而无需在数据库中实际添加其他字段?

1 个答案:

答案 0 :(得分: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);

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