c# - 在父对象中删除时从子对象中删除实体子对象的选项
问题描述
我有以下课程
{
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(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();
}
}
推荐阅读
- javascript - 使用 json 对不同数组进行排序的网站使用 JavaScript
- spring - 如何在文本框值更改时提交 Thymeleaf 表单?
- java - 如何为计算器添加当前值方法
- c++ - 为什么打开带有格式的文件时fstream会导致分段错误?
- pine-script - Pine 回测,如果已经打开了一个新交易,则不会打开一个新交易
- jenkins - Jenkins 中的字符串参数不起作用
- c# - 避免使用 EF Core 将父实体附加到子实体上
- telegram-bot - 如何使 Telegram bot 内联缓存区分大小写?
- tensorflow - 如何为任何通用数据集确定卷积神经网络的结构/架构?
- angular - 我无法运行我的角度应用程序