我通常有我要删除的主实体,但在本例中,我试图通过导航属性删除它

var person = await dbContext.Person
                    .Include(x => x.Phone)
                    .FirstOrDefaultAsync(d => d.PersonKey == key, cancellationToken);

person.Phones.Remove(phoneToDelete);

await dbContext.SaveChangesAsync();

我在SaveChangesAsync()上得到了以下异常

Exception thrown: 'System.InvalidOperationException' in Microsoft.EntityFrameworkCore.dll: 'The association between entity types 'Person' and 'Phone' has been severed, but the relationship is either marked as required or is implicitly required because the foreign key is not nullable. If the dependent/child entity should be deleted when a required relationship is severed, configure the relationship to use

以下代码可以正常工作:

dbContext.Remove(phoneToDelete);
await dbContext.SaveChangesAsync();

所以,当然我确实让它工作了,但我认为原始代码应该可以工作,并想知道为什么它不能.

推荐答案

错误消息提示问题:'The association between entity types 'Person' and 'Phone' has been severed, but the relationship is either marked as required or is implicitly required because the foreign key is not nullable.

如果您的Person模型有一个int PhoneId属性作为Phone的外键,您将无法删除与Person关联的Phone条目.

如果您想要这样做,您需要将您的Person型号更改为int? PhoneId,这将使其变为nullable,并允许您删除相关条目.

如果不清楚,原因是int类型不能保存null值,这是删除Phone时留下的值.同时,int?可以保持null值,因此允许删除Phone和离开PhoneId = null.

Csharp相关问答推荐

为什么xslWriter不总是按照xslWriterSet中指定的格式格式化该文档?

C# uwp中的Win11启动屏幕剪辑工作方式不同

使用C#中的Shape API从Azure目录获取所有用户

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

. NET Core DB vs JSON模型设计

FileStream. FlushAsync()是否确保文件被写入磁盘?

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

Blazor WebApp:原始异常:AADSTS700025:客户端是公共的,因此既不应显示客户端,也不应显示客户端

无法创建';';类型的';DbContext';.异常';无法解析类型';Microsoft.EntityFrameworkCore.DbContextOptions`1[Comm的服务

获取具有AutoFaces的所有IOptions对象的集合

单元测试:模拟返回空

如何将端点(或с匹配请求并判断其路径)添加到BCL?

如何在用户在线时限制令牌生成?

RX操作员使用先前值进行扫描,信号来自值本身

未显示详细信息的弹出对话框

如何在一次数据库调用中为ASP.NET核心身份用户加载角色

C#中使用ReadOnlySpan的泛型类型推理

使用C#12中的主构造函数进行空判断

SharpZipLib在文件名前加上目录名,生成tar.gz

无效的Zip文件-Zip存档