2016-03-06 90 views
1

我读过很多地方应该(通常)在实体中拥有外键id,因为它是一个数据库细节,事实上,EF通过在相应的表中添加一个EntityName_Id列来很好地管理它。实体框架:在实体中包含外键ID?

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属性的唯一用法吗?我在这里错过了什么吗?

回答

1

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

它说:

随着外键关联,您可以使用两种方法来改变, 创建或修改关系。使用独立的关联,您的 不能使用外键属性。在文章提供

使用案例:

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

    通过向外键属性分配新值,如以下示例中的 一样。

    course.DepartmentID = newCourse.DepartmentID;

  2. 删除外键关系。这只适用于没有与FK属性相关联的对象,处于'已添加'状态。

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

    course.DepartmentID = null;

从这些情况下,您可以用它来检查,如果您参考不为空/空没有真正延迟加载相关的实体像你说的

除了:

var isNull = course.DepartmentID == null; 

我认为这是非常它。从我的角度来看,使用FK物业带来的好处太小而不能依靠它们。