【发布时间】:2021-02-25 02:53:42
【问题描述】:
我使用的是 EF Core 3.1 DB 首先,尝试将 DeleteBehavior.SetNull 设置为可选关系,但我仍然在 SaveChanges 上遇到异常。
实体是:Patient,它在名为Address 的字段中与Address 具有可空的关系。
实体是由这样的脚手架-DbContext cmd生成的(我删除了与问题无关的属性):
public partial class Address
{
public Address()
{
Patient = new HashSet<Patient>();
}
public int Id { get; set; }
...
public virtual ICollection<Patient> Patient { get; set; }
}
和患者类别:
public partial class Patient
{
public int Code { get; set; }
public int? Address { get; set; }
...
public virtual Address AddressNavigation { get; set; }
}
在OnModelCreating 函数中,我有以下代码:
modelBuilder.Entity<Patient>(entity =>
{
...
entity.HasOne(d => d.AddressNavigation)
.WithMany(p => p.Patient)
.HasForeignKey(d => d.Address)
.HasConstraintName("FK__Patient__Address__2F10007B")
.OnDelete(DeleteBehavior.SetNull);
});
当我尝试删除地址时,使用以下代码行:
using (ClinicContext ctx = new ClinicContext())
{
var address = ctx.Address.Find(addressId);
ctx.Remove(address);
ctx.SaveChanges();
}
我得到以下异常:
DELETE 语句与 REFERENCE 约束冲突 “FK__Patient__Address__2F10007B”。数据库发生冲突 “C:\USERS\USER\SOURCE\REPOS\CLINIC\DB\CLINIC.MDF”,表 “dbo.Patient”,“地址”列。声明已终止
我在这里错过了什么?
【问题讨论】:
-
如果您首先使用 DB,那么除非您迁移数据库,否则
.OnDelete()行为不会产生任何影响。我怀疑您数据库中的约束FK__Patient__Address__2F10007B不可为空。 -
这是创建表的脚本的相关部分: CREATE TABLE [dbo].[Patient] ( [Code] INT IDENTITY (1, 1) NOT NULL, [Id] VARCHAR (9 ) NOT NULL, [Address] INT NULL, PRIMARY KEY CLUSTERED ([Code] ASC), FOREIGN KEY ([Address]) REFERENCES [dbo].[Address] ([Id]) );
-
是的,您需要将删除集 null 添加到您的表创建查询中
-
恕我直言,在
Patient中同时拥有一个类型和一个名为Address的属性非常令人困惑。我会调用可空的 intAddressId左右
标签: c# asp.net-core entity-framework-core ef-fluent-api cascading-deletes