实体框架:与自我的多对多关系

时间:2013-06-11 10:15:48

标签: c# entity-framework foreign-keys

我有这个实体:

public abstract class DataField
{
    [Key]
    public Guid Id { get; set; }
    public virtual ICollection<DataField> Referals { get; set; }
    public virtual ICollection<DataField> Encapsulated { get; set; }
}

这张地图:

public class DataFieldMapping : EntityTypeConfiguration<DataField>
{
    public DataFieldMapping()
    {
        HasMany(x => x.Referals).WithMany(x => x.Encapsulated);
        HasMany(x => x.Encapsulated).WithMany(x => x.Referals);
        ToTable("DataField");
    }
}

关键是DataField可以有许多封装的DataField,并且本身可以被许多其他DataField封装/引用。

我不确定是否需要两条HasMany线。但...

当我运行创建两个DataField的测试时,一个引用另一个,另一个被第一个封装,我收到此错误:

无效的对象名称'dbo.DataFieldDataFields'。

我认为有必要在单独的表中存储多对多关系。所以我想如果我用正确的列创建一个名为DataFieldDataFields的表,事情就会奏效。但有没有办法告诉EF这个表被称为除DataFieldDataFields之外的其他东西?

编辑:我现在创建了该表,它可以正常工作。但EF希望该表的列名为DataField_Id和DataField_Id1。同样的问题:有没有办法告诉EF这些列的名称和表本身的名称,如果我想要将列和表命名为其他东西?

1 个答案:

答案 0 :(得分:1)

原来很简单:

        HasMany(x => x.Referals).WithMany(x => x.Encapsulated).Map(c =>
            {
                c.ToTable("DataFieldJoin");
                c.MapLeftKey("RefId");
                c.MapRightKey("EncapId");
            });