我在Entity Framework中遇到了删除问题。简而言之,即使我已经明确地配置EF使用数据库中的级联删除,EF仍然会明确地尝试从数据库中删除实体。
我的设计:
我有三种实体类型,MainEntity、EntityTypeA和EntityTypeB。 EF已被配置为在删除EntityTypeA和EntityTypeB时使用级联删除。换句话说,如果我删除MainEntity的一个实例,则希望所有相关的EntityTypeA和EntityTypeB实例也被删除。我永远不会删除EntityTypeA或EntityTypeB而不删除它们的父级。
我的问题是,EF明确地针对EntityTypeA发出DELETE语句,导致我的应用程序崩溃。
这是我的模型长这样:
这会导致外键冲突,因为EntityTypeB的表中有引用EntityTypeA实例的项目。
问题:为什么即使我配置了Entity Framework使用级联删除,它仍会对EntityTypeA实例发出显式删除?如果我删除Include("EntityTypeA"),它就开始正常工作了。
我的设计:
我有三种实体类型,MainEntity、EntityTypeA和EntityTypeB。 EF已被配置为在删除EntityTypeA和EntityTypeB时使用级联删除。换句话说,如果我删除MainEntity的一个实例,则希望所有相关的EntityTypeA和EntityTypeB实例也被删除。我永远不会删除EntityTypeA或EntityTypeB而不删除它们的父级。
我的问题是,EF明确地针对EntityTypeA发出DELETE语句,导致我的应用程序崩溃。
这是我的模型长这样:
以下是关系的非默认配置:
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使用级联删除,它仍会对EntityTypeA实例发出显式删除?如果我删除Include("EntityTypeA"),它就开始正常工作了。