2013-04-05 4 views
4

У меня возник вопрос о том, как настроить отношения «один ко многим» с таблицей соединений, используя API Code First fluent. У меня есть компания, контакты объекта оба разделяют общий адрес объекта, как показано нижеОт одного до большого числа с таблицей объединения с использованием кода 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 
} 

Моя ожидается структура БД будет

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 с возможностью каскадного удаления. Я искал более трех дней и был удивлен, что никто не говорил или не поднимал сценарии такого типа, поэтому задаюсь вопросом, неправильный ли мой подход или ответ очень тривиален.

+1

Ваш вопрос, кажется, о каскаде удаляет больше, чем многие-ко-многим. Возможно, заголовок вопроса должен быть чем-то более похожим на «Как предотвратить каскадные удаления в EF?» –

ответ

1

Вы не можете иметь это со многими для многих (это то, что вы создаете - и то, что вы описали).

Когда вы удаляете компанию/контакт - записи таблицы «join» удаляются.

Вы можете упростить это и просто сделать это в вашей конфигурации (удалить все есть):

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

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

Но как я могу назвать имя таблицы соединений и столбцы таблицы соединений? – Ashwinbaboo

+0

Я полностью забыл о вашем сообщении :) Вы можете это сделать - но тогда у вас есть другие проблемы, это либо то или это. Думаю, ты слишком много хочешь. Если у вас есть много-ко-многим, вы не можете удалить каскад так, как хотите. Я могу дать вам правильную ручную настройку «многие ко многим», но опять же ее бесполезно для чего вы хотите. – NSGaga

Смежные вопросы