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

时间:2016-08-30 09:35:11

标签: c# entity-framework

我们的数据库有三个实体:PersonCompanyPhoneCall

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时,我发现Entity Framework存在某些不良行为。

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

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

而不是实体框架将PersonId设置为在所有关联的PhoneCall条目上为空,我想要的实体框架会抛出某种异常让我知道Person无法删除,因为有相关实体引用了所述Person

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

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

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

...但我的偏好是设置某种限制,阻止Entity Framework首先将外键设置为NULL,这样如果开发人员忘记执行此检查,我们就不会最终将PhoneCall表中的条目链接到任何内容。

这可能吗?

1 个答案:

答案 0 :(得分:4)

没有!!如果没有对代码进行明确检查,就无法实现您想要的目标。

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

要么使属性不可为空,要么在代码中进行明确检查以处理它。