使用EF Code First加入表的一对多关系

时间:2013-04-05 00:45:04

标签: entity-framework ef-code-first one-to-many jointable

我有一个关于如何使用Code First fluent API配置连接表的一对多关系的问题。我有一个公司,联系对象都共享一个公共地址对象,如下所示

Class Address {
       public int AddressId
       .....
    }

Class Company {
   public int CompanyId
   ......
   public virtual ICollection<Address> Address
}

Class Contact {
   public int ContactID
   .......
   public virtual ICollection<Address> Address
}

我期望的数据库结构是

Company Table
   CompanyId PK NOT NULL
   .....

Contact Table
    ContactId PK NOT NULL
    .....

Address Table
    AddressId PK NOT NULL
    .....

CompanyAddress Table
    CompanyId NOT NULL
    AddressId NOT NULL

ContactAddress Table
    ContactId NOT NULL
    AddressId NOT NULL

我能够通过使用以下流畅的API

来实现这一目标
modelBuilder.Entity<Company>()
  .HasMany(c => c.Address)
  .WithMany()
  .Map(m =>
    {
      m => m.MapLeftKey("CompanyId")
            .MapRightKey("AddressId")
            .ToTable("CompanyAddress")});

modelBuilder.Entity<Contact>()
  .HasMany(c => c.Address)
  .WithMany()
  .Map(m =>
    {
      m => m.MapLeftKey("ContactId")
            .MapRightKey("AddressId")
            .ToTable("ContactAddress")});

但EF开始处理公司和地址多对多关系,当我尝试删除公司或联系人时,它不会删除相应的地址记录(因为EF会将它们视为多对多),我该如何定义此类型使用EF与级联删除选项的关系。我搜索了超过3天,并且很惊讶没有人谈过或提出这种情况,所以想知道我的方法是错误还是回答非常简单。

1 个答案:

答案 0 :(得分:1)

你不可能拥有多对多(这就是你正在创造的东西)   - 以及你所描述的内容。

删除公司/联系人时,会删除“加入”表记录。

你可以简化它,只需在配置中执行此操作(删除所有内容):

modelBuilder.Entity<Company>()
    .HasMany(c => c.Address)
    .WithOptional()
    .WillCascadeOnDelete(true);

modelBuilder.Entity<Contact>()
    .HasMany(c => c.Address)
    .WithOptional()
    .WillCascadeOnDelete(true);