EF5多对多联接表流畅的API

时间:2013-02-17 11:38:35

标签: c# many-to-many entity-framework-5 poco

我是否必须创建一个POCO类来表示多对多关系中的连接表?

这是我的情景:

public class Event 
{
    public int EventId { get; set; }
    public int OrganizerId { get; set; }
}

public class Person 
{
    public int PersonId { get; set; }
    ICollection<Event> Events { get; set; }
}

public class Company 
{
    public int CompanyId { get; set; }
    ICollection<Event> Events { get; set; }
}

个人或公司都可以组织一个活动,我想创建一个像

这样的联接表
Table Events_People
PersonId
OrganizerId


Table Events_Companies
CompanyId
OrganizerId

我知道如果我创建两个POCO类,比如

,那应该很容易
public class EventPerson
{
    public int EventId { get; set; }
    public Person PersonId { get; set; }
}

比Fluent API更像

modelBuilder.Entity<Person>()
// PK
.HasKey(e => e.PersonId)
// FK
.HasMany(e => e.Events)
.WithRequired(e => e.PersonId);

有没有办法避免两个POCO并直接告诉API创建连接表? 感谢

1 个答案:

答案 0 :(得分:1)

你可以用EF做多对多。更大的问题是一个好主意。例如,如果您这样做并且您需要或想要它,您可能会发现级联删除存在问题。如果你最终得到了同一个实体的2个必需关系(不一定是你的特定示例代码),但是通常与你的问题匹配,那么你可以获得EF编译/运行时错误,除非你使用WillCascadeOnDelete(false)。为了以防人们的想法,你可以这样做。 Becareful: - 。)

但您问过,您可以告诉EF创建加入

您没有看到EF生成的联接表吗?我原以为是。我好奇为什么不。

您可以明确管理它:

HasMany(t => t.NavigationProperty1)
.WithMany(a => a.ReverseNavigationProperty)
.Map(c => c.ToTable("TheJoinTable"));



// rename keys as required, may not be required...
c.MapLeftKey("ColumnKeyName");
c.MapRightKey("ABetterName2");

顺便说一下,您建议的示例正是解决某些CascadeOnDelete问题所需的模式。