实体框架 CTP5,代码优先。具有级联删除功能的多对多

2024-02-11

我有两个实体(Customer 和 CustomerRole),想声明它们之间的多对多关系。我可以使用以下代码:

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

但它创建的关系(和第三个映射表)默认关闭级联删除。使用多对多时,如何告诉 EF 创建级联删除打开的关系?


从CTP5开始,似乎没有办法通过Fluent API直接打开多对多关联的级联删除。

也就是说,如果您的目的是确保可以删除主体(例如客户记录),而不必担心连接表中的依赖记录(即 Customer_CustomerRole_Mapping),那么您不需要在数据库,因为当涉及多对多关联时,EF Code First 将处理客户端的级联删除。

例如,当您删除一个Customer对象时,EF足够聪明,首先发送一条删除语句来删除连接表中的依赖记录,然后它会发送另一个删除语句来删除该Customer记录。

Update:

由于 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();
}

请注意,这只是一种解决方法,我们将能够(希望)删除主体而不加载其导航属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 CTP5,代码优先。具有级联删除功能的多对多 的相关文章

随机推荐