在父对象中删除时从子对象中删除实体子对象的选项
Options to Delete Entity child from children when deleted in parent object
我有以下类
{
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 的数据库中获取现有子项并将它们与更新后的子项进行比较?
首先尝试使用
ICollection<Child> Children
而不是使用
IEnumerable<Child> Children
然后尝试从父对象中移除子对象(调试验证),然后调用ctx.Update(父)方法(我假设这没有被跟踪)
示例:
@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();
}
}
我有以下类
{
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 的数据库中获取现有子项并将它们与更新后的子项进行比较?
首先尝试使用
ICollection<Child> Children
而不是使用
IEnumerable<Child> Children
然后尝试从父对象中移除子对象(调试验证),然后调用ctx.Update(父)方法(我假设这没有被跟踪)
示例:
@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();
}
}