1

我是否必须创建一个 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 创建连接表?谢谢

4

1 回答 1

1

您可以使用 EF yes 进行多对多操作。更大的问题是这是个好主意。例如,如果您这样做并且您需要或想要这样做,您可能会发现您遇到了级联删除问题。如果您最终与同一实体有 2 个必需的关系(不一定是您的特定示例代码)但更普遍地与您的问题匹配,那么除非您使用 WillCascadeOnDelete(false),否则您可能会收到 EF 编译/运行时错误。以防万一人们认为,因此您可以这样做。当心。:-)

但是你问你能告诉 EF 创建一个 Join

您没有看到 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 问题所需的模式。

于 2013-02-17T12:32:50.860 回答