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, похоже, что нет возможности напрямую включать каскадные удаления в ассоциациях Many to Many Fluent API.

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

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

Обновление:

Из-за ошибки в 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();
}

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