从 CTP5 开始,似乎无法通过 Fluent API 直接打开多对多关联的级联删除。
也就是说,如果您的目的是确保您可以删除主体(例如客户记录)而不必担心连接表中的依赖记录(即 Customer_CustomerRole_Mapping),那么您不需要打开数据库上的级联,因为 EF Code First 将在客户端处理多对多关联时的级联删除。
例如,当你删除一个客户对象时,EF 很聪明,它会先发送一条删除语句来删除连接表中的依赖记录,然后再发送一条删除语句来删除客户记录。
更新:
由于 CTP5 中的错误,您需要显式急切/延迟加载导航属性,并在删除依赖项时将其加载到上下文中。例如,考虑这个模型:
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();
}
请注意,这只是一种解决方法,我们将能够(希望)在不加载其导航属性的情况下删除主体。