2013-04-05 127 views
4

我有一个关于如何使用Code First fluent API配置与一个连接表的一对多关系的问题。我有一个公司,联系对象都是共用一个地址对象像下面使用EF代码优先加入表与一对多关系

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 
} 

我预计DB结构将是

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

你的问题似乎是关于级联删除比许多一对多的关系,等等。也许问题的标题应该更像“我如何防止EF中的级联删除?” – 2013-04-05 00:53:25

回答

1

你不能与多对多(这是你创建 - 和你所描述的)。

当您删除公司/联系人时,'联接'表记录被删除。

可以简化,只是这样做在你的配置(删除所有已):

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

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

但是,我如何提到连接表名和连接表的列呢? – Ashwinbaboo 2013-04-09 01:18:52

+0

我完全忘了你的帖子:)你可以做到这一点 - 但那么你有其他问题,它是这个或那个。你想太多我想。如果你有多对多的 - 你不能按你想要的方式删除级联。我可以给你一个适当的手动设置多对多 - 但它再次没用你想要的。 – NSGaga 2013-04-09 01:41:21