4

我有一个关于如何使用 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 开始将 Company 和 Address 视为多对多关系,当我尝试删除 Company 或 Contacts 时,它不会删除相应的地址记录(因为 EF 将它们视为多对多),我如何定义这种类型的关系使用具有级联删除选项的 EF。我搜索了3天多,很惊讶没有人谈论或提出这种情况,所以想知道我的方法是错误的还是答案很琐碎。

4

1 回答 1

1

你不能在多对多中拥有它(这是你正在创造的 - 以及你所描述的)。

当您删除公司/联系人时-“加入”表记录被删除。

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

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

modelBuilder.Entity<Contact>()
    .HasMany(c => c.Address)
    .WithOptional()
    .WillCascadeOnDelete(true);
于 2013-04-05T03:02:58.857 回答