1

我的项目中有以下模型(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。是什么导致了这种行为?

4

1 回答 1

1

这是一个有根据的猜测:

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

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

于 2013-04-05T09:51:12.377 回答