Entity Framework CTP5, сначала код. Много ко многим с каскадным удалением

У меня есть две сущности (Customer и CustomerRole), и я хотел бы объявить отношения "многие ко многим" между ними. Я могу сделать, используя следующий код:

modelBuilder.Entity<CustomerRole>()
        .HasMany(cr => cr.Customers) 
        .WithMany(c => c.CustomerRoles)
        .Map(m => m.ToTable("Customer_CustomerRole_Mapping"));

Но он создает связь (и третью таблицу сопоставления) с отключенным каскадным удалением по умолчанию. Как я могу сказать EF создать связь с включенным каскадным удалением при использовании "многие ко многим"?

1 ответ

Начиная с CTP5, кажется, что нет способа напрямую включить каскадное удаление при связывании "многие ко многим" с помощью Fluent API.

Тем не менее, если вы намереваетесь убедиться, что вы можете удалить участника (например, запись клиента), не беспокоясь о зависимой записи в объединяющей таблице (т. Е. Customer_CustomerRole_Mapping), вам не нужно включать каскады на база данных, так как EF Code First позаботится о каскадном удалении на стороне клиента, когда дело доходит до ассоциаций "многие ко многим".

Например, когда вы удаляете объект Customer, EF достаточно умен, чтобы сначала отправить оператор удаления, чтобы избавиться от зависимой записи в объединяющей таблице, а затем отправит еще один оператор удаления для удаления записи клиента.

Обновить:

Из-за ошибки в CTP5 вам необходимо явно нетерпеливо /Lazy загрузить свойство навигации и загрузить его в контекст при удалении зависимого. Например, рассмотрим эту модель:

public class User
{
 public int UserId { get; set; }
 public virtual ICollection Addresses { get; set; }
}

public class Address
{
 public int AddressID { get; set; } 
 public virtual ICollection Users { get; set; }
}

Предполагая, что у нас есть Пользователь с адресом в базе данных, этот код будет выдавать:

using (EntityMappingContext context = new EntityMappingContext())
{
 User user = context.Users.Find(1); 
 context.Users.Remove(user);
 context.SaveChanges();
}

Тем не менее, этот будет отлично работать с удалением записи таблицы ссылок:

using (EntityMappingContext context = new EntityMappingContext())
{
 User user = context.Users.Find(1); 
((IObjectContextAdapter)context).ObjectContext
                                .LoadProperty(user, u => u.Addresses);
 context.Users.Remove(user);
 context.SaveChanges();
}

Обратите внимание, что это всего лишь обходной путь, и мы сможем (мы надеемся) удалить участника без загрузки его свойства навигации.

Другие вопросы по тегам