gpt4 book ai didi

c# - 防止 Entity Framework 将外键设置为 NULL

转载 作者:行者123 更新时间:2023-11-30 20:34:26 25 4
gpt4 key购买 nike

我们的数据库包含三个实体: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, Entity Framework 会更新所有关联的PhoneCall 条目并将PersonId 设置为NULL。

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

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

问题似乎是 Entity Framework 不遵守 PhoneCall.PersonIdPhoneCall.CompanyId 外键,因为它们都(必须)可为空。

我显然可以像这样在删除之前执行自己的检查:

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

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

这可能吗?

最佳答案

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

如果我们将属性设置为可为 null,我们会告诉框架您可以根据需要将其设置为 null。那为什么设置为null会报错呢?

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

关于c# - 防止 Entity Framework 将外键设置为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com