将属性导航到同一个表

本文关键字:同一个 导航 属性 | 更新日期: 2023-09-27 18:07:38

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

客户

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

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

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

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

在加载InvoiceAddress的引用之后,还将加载DeliveryAddress。然而,只有当发票和交货ID相同时,才会发生这种情况。当它们不相等时,不会加载DeliveryAddress。是什么导致了这种行为?

将属性导航到同一个表

这里有一个有根据的猜测:

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

如果PKs不同,则发票和交货地址由不同的实体表示,加载其中一个不会影响另一个。