EF CodeFirst 级联删除

默认情况下CodeFirst会在外键约束中设置 删除规则 为级联(不会默认设置 更新规则 为级联)
当仅定义了导航属性如
public virtual Manager Manager { get; set; }
而没有显示定义外键如
public int ManagerID { get; set; }
CodeFirst不会设置 删除规则 为级联


在显示定义外键属性的情况下,级联删除的关闭,可以通过Fluent API进行
modelBuilder.Entity<Department>().HasRequired(m => m.Manager).WithMany(n => n.Departments).HasForeignKey(m => m.ManagerID).WillCascadeOnDelete(false);


CodeFirst默认开启级联删除,考虑到EF中的级联删除并不常用,所以可以在OnModelCreating方法中使用Fluent API关掉所有主外键关系的级联删除
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
如果需要再使用.WillCascadeOnDelete(true) 单独打开某个主外键的级联删除


CodeFirst中,默认生成的数据表中外键字段不允许Null值,这样,就不能通过赋外键字段为Null值来解除关联关系,通过FluentAPI,可以修改外键字段为允许Null值
modelBuilder.Entity<Department>().HasOptional(m => m.Manager).WithMany(n => n.Departments);


参考资料

EntityFramework级联删除的操作方式 - 我的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/applewangpai/article/details/17397349


EF学习杂记33:EF中的级联删除是怎么运作的 - Bruse - 博客园
http://www.cnblogs.com/brusehht/archive/2010/08/26/1809055.html


EF里单个实体的增查改删以及主从表关联数据的各种增删改查 - lonelyxmas - 博客园
http://www.cnblogs.com/lonelyxmas/p/3567529.html


EF里一对一、一对多、多对多关系的配置和级联删除 - 心态要好 - 博客园
http://www.cnblogs.com/oppoic/p/ef_one-to-one_one-to-many_many-to-many_cascadedelete.html


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 EF 中,可以使用「级联更新」来自动更新关联的对象。这样可以在保存一个实体时,同时保存这个实体所关联的实体。 要实现级联更新,需要在实体之间建立关联。通常可以使用数据库外键或者导航属性来建立关联。 然后,需要在 EF 模型中配置这些关联,以指定在保存实体时应该进行级联更新。在 EF Core 中,可以使用「OnDelete」方法来配置级联删除。在 EF 6 中,可以使用「WillCascadeOnDelete」方法来配置级联删除,也可以使用「WillCascadeOnUpdate」方法来配置级联更新。 例如,在 EF Core 中,如果有一个「Blog」实体和一个「Post」实体,其中「Blog」实体有一个「Posts」属性表示博客的帖子列表,那么可以使用以下代码来配置级联更新: ``` modelBuilder.Entity<Blog>() .HasMany(b => b.Posts) .WithOne(p => p.Blog) .OnDelete(DeleteBehavior.Cascade); ``` 在保存「Blog」实体时,EF 会自动保存所有关联的「Post」实体。 在 EF 6 中,配置级联更新的方式略有不同,可以使用以下代码: ``` modelBuilder.Entity<Blog>() .HasMany(b => b.Posts) .WithRequired(p => p.Blog) .WillCascadeOnDelete(true); ``` ### 回答2: EFEntity Framework)是一个用于.NET应用程序的对象关系映射(ORM)框架,它提供了实现级联更新的功能。级联更新是指在更新一个实体时,同时更新与之关联的其他实体。 EF实现级联更新的方法有两种:显式和隐式。 首先,显式实现级联更新需要手动编写代码来进行操作。在更新一个实体之前,我们需要先加载与之关联的其他实体,然后对这些实体进行相应的更新操作。例如,如果一个订单实体关联着多个订单项实体,我们需要先加载这些订单项实体,然后对它们进行更新。可以使用EF的Include方法来加载关联实体,并使用DbContext的SaveChanges方法来保存更改。 其次,隐式实现级联更新是通过设置实体之间的关系来实现的。在EF中,我们可以通过定义实体之间的导航属性、配置关系映射以及设置级联操作的规则来实现级联更新。例如,通过设置关系映射的级联更新规则为Cascade,当更新一个实体时,EF会自动检测并更新与之关联的其他实体。这样,当我们更新订单时,所有关联的订单项会自动更新。 总结来说,EF实现级联更新可以通过显式和隐式两种方式来实现。显式方式需要手动加载和更新相关实体,而隐式方式则通过设置实体之间的关系和级联规则来自动实现级联更新。具体选择哪种方式取决于实际需求和开发人员的偏好。 ### 回答3: EFEntity Framework)是一个用于.NET应用程序的对象关系映射(ORM)框架,用于将数据库中的数据映射到应用程序中的对象模型。在EF中,级联更新是指当修改一个实体时,同时自动更新相关联的其他实体。 要实现级联更新,可以按照以下步骤进行操作: 1. 配置关联关系:在EF中,级联更新依赖于相关联的对象之间的导航属性。在实体类中,使用注解或Fluent API来配置对象之间的关系。例如,可以使用`[ForeignKey]`注解或`HasMany`、`WithOne`等方法配置一对多关系。 2. 加载关联数据:在修改实体之前,确保相关联的实体已经从数据库加载到内存中。可以使用`Include`方法在查询中包含相关联的数据。 3. 修改实体:对要修改的实体进行更新操作。可以直接修改属性的值,或使用`DbContext`的`Update`方法将实体标记为已修改。 4. 保存更改:调用`SaveChanges`方法将更改保存到数据库中。此时,EF会自动检测到实体的状态变化,并根据配置的级联更新关系,将相关联的实体一起更新到数据库。 需要注意的是,级联更新可能会导致性能问题和数据不一致的风险,因此需要谨慎使用。在配置级联更新时,可以选择禁止或限制特定关系的级联更新,以避免潜在的问题。 总之,通过配置关联关系、加载关联数据、修改实体和保存更改,可以实现EF中的级联更新操作。这样,当修改一个实体时,相关联的实体也会被自动更新到数据库中,从而确保数据的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值