我在实体框架中遇到了删除问题。简而言之,即使我已明确将 EF 配置为在数据库中使用级联删除,EF 也会显式尝试从数据库中删除实体。
我的设计:
我有三种实体类型MainEntity
,EntityTypeA
和EntityTypeB
。EF 已配置为在删除EntityTypeA
和时使用级联删除EntityTypeB
。换句话说,如果我删除 的一个实例MainEntity
,我希望也删除所有相关EntityTypeA
的EntityTypeB
实例。我从不删除EntityTypeA
或EntityTypeB
不删除他们的父母。
我的问题是 EF 明确发出DELETE
for 的语句EntityTypeA
,这导致我的应用程序崩溃。
这是我的模型的样子:
这些关系具有以下非默认配置:
MainEntity -> EntityTypeA OnDelete: Cascade
MainEntity -> EntityTypeB OnDelete: Cascade
关系EntityTypeA -> EntityTypeB
有OnDelete: None
数据库内容
INSERT INTO MainEntities (Name) values ('Test')
insert into EntityTypeA (MainEntityID) VALUES (1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
我的代码:
class Program
{
static void Main(string[] args)
{
var context = new Model1Container();
var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault();
context.DeleteObject(mainEntity);
context.SaveChanges();
}
}
发生什么了
当我调用 SaveChanges 时,Entity Framework 在数据库中执行以下操作:
exec sp_executesql N'delete [dbo].[EntityTypeA]
where ([Id] = @0)',N'@0 int',@0=1
这会导致外键违规,因为 EntityTypeB 的表中存在引用 EntityTypeA 实例的项目。
问题
即使我已将 Entity Framework 配置为使用级联删除,为什么 Entity Framework 仍会为 EntityTypeA 的实例发出显式删除?如果我删除 Include("EntityTypeA") 它会再次开始工作。