我的项目中有一个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。 是什么导致了这种行为?
答案 0 :(得分:1)
这是一个有根据的猜测:
当您急切地引用实体时,您会立即SELECT
。获取数据后,实体管理器会在EF意义上创建实体。由于DeliveryAddress
和InvoiceAddress
实际上是同一个实体(相同的PK,如果你有一个复合键,它必须是相同的复合键),它使用相同的实例来表示它们,这也意味着两个地址都被加载 - 因为为什么不呢?它是完全相同的实体,数据指向DB中的同一行。引用是共享的,它使用更少的内存。
如果PK不同,那么发票和发货 地址由不同的实体表示,加载一个不会影响另一个。