实体框架:在实体中包含外键ID?

时间:2016-03-06 07:02:46

标签: c# entity-framework

我已经在很多地方读过一个应该(通常)在一个实体中拥有外键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; }
}

在此示例中,OrderInvoice具有可选关系。在显示有关Order的信息时,我有兴趣知道它是否有Invoice
问题是如果我的实体中没有'InvoiceId'属性,我必须检查整个相关实体只是为了检查它是否存在,而在我的实体中拥有该属性将允许我检查它为null,在实体已经加载的意义上,它是“免费的”。

这是在实体中使用外键Id属性的唯一用法吗?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您可以查看实体框架文档以查看问题的答案: https://msdn.microsoft.com/en-US/data/jj713564.aspx

它说:

  

使用外键关联,您可以使用任一方法进行更改,   创建或修改关系。有了独立的协会,你   不能使用外键属性。

文章中提供的用例:

  1. 更新外键关系 - 如果同时更新导航属性和外键并引用不同的对象,这可能会导致问题。

      

    通过为外键属性分配新值,如中所示   以下示例。

         

    course.DepartmentID = newCourse.DepartmentID;

  2. 删除外键关系。这仅在没有具有FK属性的关联对象时才有效,即处于“已添加”状态。

      

    以下代码通过设置外键来删除关系   为空。请注意,外键属性必须可以为空。

         

    course.DepartmentID = null;

  3. 除了这些情况之外,您可以使用它来检查您的引用是否为null / null,而不是像您所说的那样真正的延迟加载相关实体:

    var isNull = course.DepartmentID == null;
    

    我相信它几乎就是这样。从我的观点来看,使用FK属性的好处太小而不能依赖它们。