繁体   English   中英

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

[英]Prevent Entity Framework from setting foreign key to NULL

我们的数据库具有三个实体: 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();

我不希望实体框架在所有关联的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");

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

这可能吗?

没有!! 没有对代码进行显式检查,就无法实现所需的功能。

如果将属性设置为可为空,则告诉框架您可以根据需要将其设置为null。 那么为什么将其设置为null时会显示任何错误?

您可以使该属性不可为空,或者在代码中进行显式检查以对其进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM