防止实体框架将外键设置为NULL

本文关键字:设置 NULL 实体 框架 | 更新日期: 2023-09-27 18:04:36

我们的数据库有三个实体:Person, CompanyPhoneCall

Person描述个体。Company描述了一家公司。PhoneCall描述呼叫PersonCompany的详细信息。

public class Person
{
    public int Id { get; set;}
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}
public class Company
{
    public int Id { get; set;}
    public string Name { get; set; }
    public string VatNumber { get; set; }
}
public class PhoneCall
{
    public int Id { get; set;}
    public string Description { get; set;}
    public int Duration { get; set;}
    public int? PersonId { get; set; }
    public Person Person { get; set; }
    public int? CompanyId { get; set; }
    public Company Company { get; set; }
}

当删除PersonCompany时,我看到实体框架的某些不良行为。

如果我删除Person,实体框架正在更新任何相关的PhoneCall条目,并将PersonId设置为NULL。

dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();

不是实体框架在所有相关的PhoneCall条目上将PersonId设置为null,我想要的是实体框架抛出某种异常,让我知道Person不能被删除,因为有相关的实体引用说Person

问题似乎是实体框架不尊重PhoneCall.PersonIdPhoneCall.CompanyId外键,因为它们(必然)都是可空的。

显然,我可以在删除之前执行自己的检查,如下所示:

if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
    throw new InvalidOperationException("Cannot delete person with associated calls");

…但我的偏好是设置某种限制,以防止实体框架首先将外键设置为NULL,这样如果开发人员忘记执行此检查,我们就不会以PhoneCall表中的条目链接到什么都没有结束。

这可能吗?

防止实体框架将外键设置为NULL

不!!如果没有在代码中进行显式检查,就无法实现您想要的效果。

如果我们将属性设置为nullable,我们告诉框架,如果需要,你可以将其设置为null。那么当它被设置为null时为什么会显示任何错误呢?

要么使属性不可为空,要么在代码中进行显式检查来处理它