很明显何时使用导航属性。但是什么时候应该使用反向导航属性?什么时候不应该使用反向导航属性?
当我使用导航属性创建双向关系时,我是否应始终使用反向导航属性?
有没有指导原则?
它们不会影响生成的sql。所以从数据库结构的角度来看,这并不重要。
但是当您通过linq查询数据库中的数据时,您可以在“where”和“include”语句中使用该属性。因此,它为您提供了更多创建查询的选项。
我几乎总是具体的逆导航属性。
我的指导原则是努力保持简单。在我需要之前我不会使用它们。 :)就像任何其他公共成员或方法(或任何代码)一样,只有在存在合理的情况下才存在。
反向属性的存在表明我可以将该实体视为顶级并且需要能够引用它的相关实体。例如,客户包含订单,那么问题是订单是否应该引用它的客户?
如果我可以查询订单(无论客户如何)并希望能够访问这些查询中的客户信息,那么拥有反向属性是有益的。
var orderDetails = context.Orders.Where(o => o.OrderDate == DateTime.Today)
.Select(o => new
{
o.OrderId,
o.OrderNumber,
CustomerName = o.Customer.Name
}).ToList();
而不是在查询中加入客户和订单,以通过单向参考访问客户和订单详细信息。 (我试着从记忆中写一个例子,但它太快了太快了。:D)
没有意义的地方是“总是”有双向参考。例如,当你有一个像Address和AddressType的东西。 AddressType永远不需要知道该类型的地址列表,即使您确实想要查询该详细信息,也可以通过单向引用进行过滤。有意义的是,地址(相对于地址类型)是顶级参考,因为您可能希望从订单中引用客户或客户的订单。