我是否必须创建一个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创建连接表? 感谢
答案 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问题所需的模式。