防止实体框架将外键设置为NULL
本文关键字:设置 NULL 实体 框架 | 更新日期: 2023-09-27 18:04:36
我们的数据库有三个实体:Person
, Company
和PhoneCall
。
Person
描述个体。Company
描述了一家公司。PhoneCall
描述呼叫Person
或Company
的详细信息。
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; }
}
当删除Person
或Company
时,我看到实体框架的某些不良行为。
如果我删除Person
,实体框架正在更新任何相关的PhoneCall
条目,并将PersonId
设置为NULL。
dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();
不是实体框架在所有相关的PhoneCall
条目上将PersonId
设置为null,我想要的是实体框架抛出某种异常,让我知道Person
不能被删除,因为有相关的实体引用说Person
。
问题似乎是实体框架不尊重PhoneCall.PersonId
和PhoneCall.CompanyId
外键,因为它们(必然)都是可空的。
显然,我可以在删除之前执行自己的检查,如下所示:
if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
throw new InvalidOperationException("Cannot delete person with associated calls");
…但我的偏好是设置某种限制,以防止实体框架首先将外键设置为NULL,这样如果开发人员忘记执行此检查,我们就不会以PhoneCall
表中的条目链接到什么都没有结束。
这可能吗?
不!!如果没有在代码中进行显式检查,就无法实现您想要的效果。
如果我们将属性设置为nullable,我们告诉框架,如果需要,你可以将其设置为null。那么当它被设置为null时为什么会显示任何错误呢?
要么使属性不可为空,要么在代码中进行显式检查来处理它