导航属性到同一个表

时间:2013-04-05 09:43:33

标签: c# entity-framework dbcontext

我的项目中有一个folling模型(EF5,DBContext,数据库优先):

客户

 InvoiceAddress -> Addresses (table)
 DeliveryAddress -> Addresses (table)

所以我在同一张桌子上有2个外键。

当我使用以下语句加载客户实体时:

 var cst = ctx.Customers.Where(c => c.CustomerID == 2).SingleOrDefault();
     ctx.Entry(cst).Reference(c => c.InvoiceAddress).Load();

加载InvoiceAddress的引用后,也会加载DeliveryAddress。但是,这仅在发票和交货ID相同时才会发生。如果它们不相等,则不会加载DeliveryAddress。 是什么导致了这种行为?

1 个答案:

答案 0 :(得分:1)

这是一个有根据的猜测:

当您急切地引用实体时,您会立即SELECT。获取数据后,实体管理器会在EF意义上创建实体。由于DeliveryAddressInvoiceAddress实际上是同一个实体(相同的PK,如果你有一个复合键,它必须是相同的复合键),它使用相同的实例来表示它们,这也意味着两个地址都被加载 - 因为为什么不呢?它是完全相同的实体,数据指向DB中的同一行。引用是共享的,它使用更少的内存。

如果PK不同,那么发票和发货 地址由不同的实体表示,加载一个不会影响另一个。