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



我有以下类

{
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)其中包括(孩子);(种)

then delete &在编辑表单

中更新子元素
  • Parent.Children.remove (id = = id)

提交表单并发送父对象到db存储:

:后

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

子节点已更新,但已删除的子节点仍在DB中。
是删除已删除的子元素的唯一选项,从DB中获得现有的子数据库,其中parentId == parentId并将它们与更新的子数据库进行比较?

首先尝试使用

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