目录
数据库关联删除行为定义实体Fluent API 配置关联实体创建表结构EF Core 关联实体删除行为总结DeleteBehavior.CascadeDeleteBehavior.SetNullDeleteBehavior.ClientSetNullDeleteBehavior.Restrict关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征;即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值。
数据库关联删除行为
我们先来看一看SQL Server中支持的行为。在创建外键约束时,可以指定关联表在主表删除行时,对依赖的数据如何执行操作。例如下面的SQL语句,[Order Details]表中[OrderID]字段 是外键,依赖于[Orders]表中的主键[OrderID]。
CREATE TABLE [Orders] ( [OrderID] int NOT NULL IDENTITY, [Name] nvarchar(max) NULL, [OrderDate] datetime2 NULL, CONSTRAINT [PK_Orders] PRIMARY KEY ([OrderID]));GOCREATE TABLE [Order Details] ( [DetailId] int NOT NULL IDENTITY, [OrderID] int NULL, [ProductID] int NOT NULL, CONSTRAINT [PK_Order Details] PRIMARY KEY ([DetailId]), l(); } catch (Exception) { DumpSql(); throw; } } using (var northwindContext = new NorthwindContext(behavior)) { var orderDetail = northwindContext.Set<OrderDetail>().Find(detailId); if (behavior == DeleteBehavior.Cascade) { Assert.Null(orderDetail); } else { Assert.NotNull(orderDetail); } } }
总结
根据上面的测试结果,我们可以出得如下结论:
DeleteBehavior.Cascade
如果关联实体未被跟踪,主实体的状态标记为删除,执行SaveChage时,在删除主表的数据的同时,通过数据库的行为删除关联表的数据行; 如果关联实体已经被跟踪,将主实体的状态标记为删除时,关联实体的状态也会标记为删除,执行SaveChange时,先删除关联表的数据行,然后再删除主表的数据行; 外键可以设置非空值、也可以设置为可为空值; 关联实体可以不被跟踪。DeleteBehavior.SetNull
如果关联实体未被跟踪,主实体的状态标记为删除,执行SaveChage时,在删除主表的数据时,通过数据库的行为将关联表数据行的外键更新为NULL,; 如果关联实体已经被跟踪,将主实体的状态标记为删除时,关联实体的外键会被设置为null,同时将关联实体的状态标记为修改,执行SaveChange时,先更新关联表的数据行 ,然后删除主表的数据行; 因为要将外键更新为NULL,所以外键必须设置为可空字段; 关联实体可以不被跟踪。DeleteBehavior.ClientSetNull
数据库不会执行任何行为; 关联实体必须被跟踪,将主实体的状态标记为删除时,关联实体的外键被设置为null,同时将关联实体的状态标记为修改,执行SaveChange时,先更新关联表的数据行,然后删除主表的数据行(此时的行为与DeleteBehavior.SetNull一致); 因为要将外键更新为NULL,所以外键必须设置为可空字段; 关联实体必须被跟踪,否则保存数据时会抛出异常。DeleteBehavior.Restrict
框架不执行任何操作,由开发人员决定关联实体的行为,可以将关联实体的状态设置为删除,也可以将关联实体的外键设置为null; 因为要修改关联实体的状态或外键的值,所以关联实体必须被跟踪。以上就是Entity Framework Core关联删除的详细内容,更多关于Entity Framework关联删除的资料请关注我们其它相关文章!








