在父对象中删除时从子对象中删除实体子对象的选项

Posted

技术标签:

【中文标题】在父对象中删除时从子对象中删除实体子对象的选项【英文标题】:Options to Delete Entity child from children when deleted in parent object 【发布时间】:2021-11-11 11:39:32 【问题描述】:

我有以下课程


    public int Id  get; set; 
    public string Name  get; set; 
    public IEnumerable<Child> Children  get; set; 


public class Child

    public int Id  get; set; 
    publict int ParentId get; set;
    public string ChildName  get; set; 

在 blazor 前端中,父对象被更改,一些子对象被删除。 首先让父母包含孩子:

Parent.where(id==id).include(children); (某种)

然后在编辑表单中删除和更新子项

Parent.Children.remove(id==id)

提交表单并将父对象发送到数据库进行存储:

之后:

ctx.update(parent);
ctx.savechanges();

子项已更新,但已删除的子项仍在数据库中。 是删除已删除子项的唯一选项, 从 parentId == ParentId 的数据库中获取现有子代并将它们与更新后的子代进行比较?

【问题讨论】:

也许您可以添加更多详细信息,您可以在调用 savechanges 之前显示代码吗? 是的,它是一种编辑功能,用于删除列表中的一个或多个孩子或更新它们。该对象是带有子列表的父对象,预期值在新的父对象中。 所以你想删除所有的孩子?抱歉,我只是想了解一下,以便正确回答您 对不起,不。我只想从对象父对象中删除 de DB 中的子对象,这些子对象已在前端删除。我不知道上面编辑的解释是否更清楚?像 parent = GetParent.include.children。在前端 parent.childlist.remove(id==0) & parent.childlist.remove(id==12)。更新的父对象被发送到数据库进行存储。但是 id 为 12 和 0 的孩子仍在数据库中。 【参考方案1】:

首先尝试使用

ICollection<Child> Children 

而不是使用

IEnumerable<Child> Children

然后尝试从父对象中移除子对象(调试验证),然后调用 ctx.Update(parent) 方法(我假设这没有被跟踪)

例子:

@page "/"
@inject ParentChildContext context
<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />
<button @onclick="@(() => DeleteChild())">Click me</button>
@code 
    Parent parent;

    protected async override Task OnAfterRenderAsync(bool firstRender)
    
        if(firstRender)
        
            parent = new Parent()
            
                Id = 1,
                Name = "Parent 1",
                Children = new List<Child>() 
                new Child()  Id = 1, Name = "ChildName" ,
                new Child()  Id = 2, Name = "ChildName2" 
            

            ;
            context.Parents.Add(parent);

            await context.SaveChangesAsync();
        

    

    private async void DeleteChild()
    
        parent.Children.Remove(parent.Children.ToList().FirstOrDefault(x => x.Id == 1));        
        context.SaveChanges();
    

【讨论】:

感谢您的回答。 感谢您的回答。我已将 IEnumerable 更改为 ICollection。在更新的父对象中,子对象被删除。调用更新后,被删除的孩子仍在数据库中。或者您的意思是对 DB 进行额外调用以删除与父对象连接但不在已编辑父对象子集合中的子对象?

以上是关于在父对象中删除时从子对象中删除实体子对象的选项的主要内容,如果未能解决你的问题,请参考以下文章

用javascript从子窗口向父窗口的SELECT列表添加OPTION选项

从子列表中删除对象已删除的android

如何从子表单中获取父 Symfony3 表单的值?

使用.Net Entity Framework 问题删除具有子关系的实体

从子视图中的路径对象在 UIView 中构建剪辑区域

克隆 JavaScript 对象时如何排除键列表? [复制]