我们的数据库有三个实体: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
时,我发现Entity Framework存在某些不良行为。
如果删除Person
,实体框架正在更新任何关联的PhoneCall
条目并将PersonId
设置为NULL。
dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();
而不是实体框架将PersonId
设置为在所有关联的PhoneCall
条目上为空,我想要的实体框架会抛出某种异常让我知道Person
无法删除,因为有相关实体引用了所述Person
。
问题似乎是实体框架不尊重PhoneCall.PersonId
和PhoneCall.CompanyId
外键,因为它们(必然)都可以为空。
我可以在删除之前显然执行自己的检查,如下所示:
if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
throw new InvalidOperationException("Cannot delete person with associated calls");
...但我的偏好是设置某种限制,阻止Entity Framework首先将外键设置为NULL,这样如果开发人员忘记执行此检查,我们就不会最终将PhoneCall
表中的条目链接到任何内容。
这可能吗?
答案 0 :(得分:4)
没有!!如果没有对代码进行明确检查,就无法实现您想要的目标。
如果我们将属性设置为可空,我们告诉框架,如果需要,可以将其设置为null。那么为什么当它被设置为null时会显示任何错误?
要么使属性不可为空,要么在代码中进行明确检查以处理它。