Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架(EF6)删除错误_C#_.net_Sql Server_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架(EF6)删除错误

C# 实体框架(EF6)删除错误,c#,.net,sql-server,entity-framework,entity-framework-6,C#,.net,Sql Server,Entity Framework,Entity Framework 6,在删除具有外键关系的记录时,我似乎遇到了EF6错误。我有一个包含3个一对多表和2个一对一表的父表。为了删除父记录,首先删除所有子记录,生成的SQL跳过一对一表。下面是一个示例和生成的SQL: /* select the parent records we want to remove */ var parentTable = Database.EampleTable.Where(x => x.Id == header.Id).ToList(); /* select the data re

在删除具有外键关系的记录时,我似乎遇到了EF6错误。我有一个包含3个一对多表和2个一对一表的父表。为了删除父记录,首先删除所有子记录,生成的SQL跳过一对一表。下面是一个示例和生成的SQL:

/* select the parent records we want to remove */
var parentTable = Database.EampleTable.Where(x => x.Id == header.Id).ToList();

/* select the data records we are going to remove */
var oneToMany1 = parentTable.SelectMany(x => x.OneToMany1);
var oneToMany2 = parentTable.SelectMany(x => x.OneToMany2);
var oneToMany3 = parentTable.SelectMany(x => x.OneToMany3);
var oneToOne1 = parentTable.Select(x => x.OneToOne1).First();
var oneToOne2 = parentTable.Select(x => x.OneToOne2).First();

/* Remove the one-to-many related records */
Database.OneToMany1.RemoveRange(oneToMany1);
Database.OneToMany2.RemoveRange(oneToMany2);
Database.OneToMany3.RemoveRange(oneToMany3);

/* Remove the one-to-one related records */
Database.OneToOne1.Remove(oneToOne1);
Database.OneToOne2.Remove(oneToOne2);

Database.ExampleTable.RemoveRange(table);

await Database.SaveChangesAsync(); /* exception: foreign key constraint violation */
-- Generated SQL by Entity Framework, upon delete
exec sp_executesql N'DELETE [dbo].[OneToMany1]
WHERE (([Id] = @0) AND ([OneToMany1Id] = @1))',N'@0 int,@1 int',@0=1,@1=1
go
exec sp_executesql N'DELETE [dbo].[OneToMany2]
WHERE (([Id] = @0) AND ([OneToMany2Id] = @1))',N'@0 int,@1 int',@0=1,@1=3
go
exec sp_executesql N'DELETE [dbo].[OneToMany3]
WHERE (([Id] = @0) AND ([OneToMany3Id] = @1))',N'@0 int,@1 int',@0=1,@1=11
go
exec sp_executesql N'DELETE [dbo].[ExampleTable]
WHERE ([Id] = @0)',N'@0 int',@0=1
go
生成的SQL:

/* select the parent records we want to remove */
var parentTable = Database.EampleTable.Where(x => x.Id == header.Id).ToList();

/* select the data records we are going to remove */
var oneToMany1 = parentTable.SelectMany(x => x.OneToMany1);
var oneToMany2 = parentTable.SelectMany(x => x.OneToMany2);
var oneToMany3 = parentTable.SelectMany(x => x.OneToMany3);
var oneToOne1 = parentTable.Select(x => x.OneToOne1).First();
var oneToOne2 = parentTable.Select(x => x.OneToOne2).First();

/* Remove the one-to-many related records */
Database.OneToMany1.RemoveRange(oneToMany1);
Database.OneToMany2.RemoveRange(oneToMany2);
Database.OneToMany3.RemoveRange(oneToMany3);

/* Remove the one-to-one related records */
Database.OneToOne1.Remove(oneToOne1);
Database.OneToOne2.Remove(oneToOne2);

Database.ExampleTable.RemoveRange(table);

await Database.SaveChangesAsync(); /* exception: foreign key constraint violation */
-- Generated SQL by Entity Framework, upon delete
exec sp_executesql N'DELETE [dbo].[OneToMany1]
WHERE (([Id] = @0) AND ([OneToMany1Id] = @1))',N'@0 int,@1 int',@0=1,@1=1
go
exec sp_executesql N'DELETE [dbo].[OneToMany2]
WHERE (([Id] = @0) AND ([OneToMany2Id] = @1))',N'@0 int,@1 int',@0=1,@1=3
go
exec sp_executesql N'DELETE [dbo].[OneToMany3]
WHERE (([Id] = @0) AND ([OneToMany3Id] = @1))',N'@0 int,@1 int',@0=1,@1=11
go
exec sp_executesql N'DELETE [dbo].[ExampleTable]
WHERE ([Id] = @0)',N'@0 int',@0=1
go
如您所见,两个OneTONE表记录没有被删除,因此尝试删除父表会引发异常。有趣的是,如果我在代码中注释掉父表的delete语句,生成的SQL仍然是一样的,它正在尝试删除父表


我在模型文件和上下文中寻找错误,还有其他错误,但根本没有。目前,我唯一的解决方案是手动编写所有查询,但我想知道是否有人在EF6中遇到过这种情况。

您的旁注可能是解决问题的关键。听起来,出于某种原因,您必须确定,您向我们展示的代码不是实际执行的代码。@sstan-当我逐步执行时,代码正在调试器中运行,我正在使用SQL Profiler实时监控生成的SQL。没有外部方法调用,但我目前正在调查上下文管理,以查看是否在EF之外发生了一些有趣的事情。不太可能,但我没有ideasnope,我在管理系统之外手动创建了上下文,并获得了相同的确切结果。您知道吗,如果依赖实体上的外键不可为空,然后代码首先在关系上设置级联删除?科林斯说的是对的。因此,可能在映射中EF被告知关联具有级联删除,并且依赖于此,但实际上,在数据库中,外键没有级联删除。