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