首页 > 解决方案 > 在父对象中删除时从子对象中删除实体子对象的选项

问题描述

我有以下课程

{
    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 前端中,父对象被更改,一些子对象被删除。首先让父母包括孩子:

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

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

后:

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

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

标签: c#entity-frameworkasp.net-web-apiblazorentity

解决方案


首先尝试使用

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();
    }
}

推荐阅读