我已经在很多地方读过一个应该(通常)在一个实体中拥有外键id,因为它是一个数据库细节,事实上,EF通过在相应的表中添加一个EntityName_Id列来很好地管理它。 / p>
public class Order
{
public decimal Total { get; set; }
public int? InvoiceId { get; set; }
public Invoice Invoice { get; set; }
}
public class Invoice
{
public ICollection<Order> Orders { get; set; }
}
在此示例中,Order
与Invoice
具有可选关系。在显示有关Order
的信息时,我有兴趣知道它是否有Invoice
。
问题是如果我的实体中没有'InvoiceId'属性,我必须检查整个相关实体只是为了检查它是否存在,而在我的实体中拥有该属性将允许我检查它为null,在实体已经加载的意义上,它是“免费的”。
这是在实体中使用外键Id属性的唯一用法吗?我在这里错过了什么吗?
答案 0 :(得分:1)
您可以查看实体框架文档以查看问题的答案: https://msdn.microsoft.com/en-US/data/jj713564.aspx
它说:
使用外键关联,您可以使用任一方法进行更改, 创建或修改关系。有了独立的协会,你 不能使用外键属性。
文章中提供的用例:
更新外键关系 - 如果同时更新导航属性和外键并引用不同的对象,这可能会导致问题。
通过为外键属性分配新值,如中所示 以下示例。
course.DepartmentID = newCourse.DepartmentID;
删除外键关系。这仅在没有具有FK属性的关联对象时才有效,即处于“已添加”状态。
以下代码通过设置外键来删除关系 为空。请注意,外键属性必须可以为空。
course.DepartmentID = null;
除了这些情况之外,您可以使用它来检查您的引用是否为null / null,而不是像您所说的那样真正的延迟加载相关实体:
var isNull = course.DepartmentID == null;
我相信它几乎就是这样。从我的观点来看,使用FK属性的好处太小而不能依赖它们。