gpt4 book ai didi

asp.net - Entity Framework CTP5,代码优先。多对多级联删除

转载 作者:行者123 更新时间:2023-12-04 02:16:04 25 4
gpt4 key购买 nike

我有两个实体(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 足够聪明,它首先发送一条 delete 语句来删除连接表中的依赖记录,然后它会发送另一个删除语句来删除 Customer 记录。

更新:

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

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

关于asp.net - Entity Framework CTP5,代码优先。多对多级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4593591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com