我们的数据库有三个实体: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
或时,我发现Entity Framework出现某些不良行为Company
。
如果删除Person
,则实体框架将更新所有关联的PhoneCall
条目并将其设置PersonId
为NULL。
dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();
我不希望实体框架PersonId
在所有关联的PhoneCall
条目上都设置为null ,而是希望实体框架抛出某种异常,以使我知道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
链接为空。
这可能吗?
不!!如果不对代码进行显式检查,就无法实现所需的功能。
如果将属性设置为可为空,则告诉框架,如果需要,您可以将其设置为null。那么为什么将其设置为null时会显示任何错误呢?
您可以使该属性不可为空,或者在代码中进行显式检查以对其进行处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句