当前位置: 首页 > 知识库问答 >
问题:

EF Core DB first:如何在不级联删除的情况下删除依赖项?

长孙波鸿
2023-03-14

(示例代码张贴在末尾。)

我正在使用EF Core 5数据库优先(即逆向工程POCO)。当使用“删除”集合中的项目时。Remove(),后续的SaveChange()抱怨孤儿。是的,很多问

对于代码优先方案,可以将其添加到配置中(从这里):

modelBuilder.Entity<Child>.HasKey(t => new { t.ParentId, t.ChildId });

但首先对DB来说是不现实的。如果数据库为FK关系(此处的文档引用)设置了级联删除,则生成的模型[更正]不包括

entity.OnDelete(DeleteBehavior.ClientSetNull)

并且删除(使用. Remove())确实有效,包括SaveChange()。但是...

我在这里面临的问题是,这个“解决方案”要求我们的所有FK关系都在数据库中配置级联删除。哎呀!数据完整性对我们来说很重要,通过独特的约束和不可为null的FK关系来保护数据完整性,这在以前为我们节省了很多时间。不设置级联删除也是一种类似的保护措施,仅在断开关系的情况下使用它可以说是过火了。

所以,进入第三个选项:显式删除孤立的子项,注意我在这里描述的第二个项目符号中。我所需要的只是好的旧ObjectContext。DeleteObject()但没有EF Core等价物。

Q: 如何删除该子项?如果不可能,我还有其他选择吗?

下面是一个快速的示例,它将在代码中实现:

//Create a parent with two children
var db = new Context();            
var newParent = new Parent() {Name = "NewParent"+DateTime.Now.Second};
db.Parents.Add(newParent);
newParent.Children = new List<Child>() {new Child() {Name="ChildOne"}, new Child() {Name="ChildTwo"}};
db.SaveChanges();
db.Dispose();

//Pick a parent item and delete one child item
var db2 = new Context();
var Parent = db2.Parents.First();
db2.Entry(Parent).Collection(f => f.Children).Load();
var ChildToDelete = Parent.Children.First();
Parent.Children.Remove(ChildToDelete);
db2.SaveChanges(); // -----> FAILS with "The association between entity types 'Parent' 
                   // and 'Child' has been severed, but the relationship is either marked
                   //  as required or is implicitly required because the foreign key 
                   // is not nullable."

表格本质上是

CREATE TABLE [dbo].[Child](
    [ChildId] [int] IDENTITY(1,1) NOT NULL,
    [ParentId] [int] NOT NULL,
    [Name] [nchar](20) NOT NULL,
 CONSTRAINT [PK_Child] PRIMARY KEY CLUSTERED)

CREATE TABLE [dbo].[Parent](
    [ParentId] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nchar](20) NOT NULL,
 CONSTRAINT [PK_Parent] PRIMARY KEY CLUSTERED)

ALTER TABLE [dbo].[Child]  WITH CHECK ADD  CONSTRAINT [FK_Child_Parent] FOREIGN KEY([ParentId])
REFERENCES [dbo].[Parent] ([ParentId])
ALTER TABLE [dbo].[Child] CHECK CONSTRAINT [FK_Child_Parent]

共有1个答案

阮桐
2023-03-14

而不是从父级集合中删除子级

Parent.Children.Remove(ChildToDelete);

使用删除子项

db.Set<Child>().Remove(ChildToDelte);
 类似资料:
  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级

  • 是否可以从索引中删除单个映射类型而不删除整个索引?https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-mapping.html说这已经不可能了,但我觉得这很难相信。有人能解释为什么删除了该功能吗?似乎是基本的东西。 我有一个具有两个映射的索引。我希望能够删除一种映射类型(以及该类型的所有文档)

  • 我只是想了解SpringJPA/Hibernate的某些部分是如何工作的。正如标题所说,只有在从集合中添加和删除子实体之间将实体刷新到数据库时,删除孤儿似乎才起作用,我想知道为什么。 我有一个父类,它与一个子类有一个@OneToMore关联 我正在测试让孩子在从父级删除时删除,就像这样(使用@autowiledJPARepository 如果在将子项添加到父项和删除子项之间未刷新实体管理器,则两个

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建