2010-08-26 108 views
0

这里是我的简单结构缓存而在装载实体从数据库对象框架

Customer 
    CustomerID 
    FirstName 
    LastName 
    ... 
    BrokerID <- Navigation Property created with this FK 

Broker 
    BrokerID 
    FirstName 
    LastName 

现在的问题是,如果我加载多个客户,我想看看客户的名单,我也需要看与客户关联的经纪人姓名,现在一个经纪人可能会有很多客户,因此返回的多个客户很可能会重复BrokerID。

我猜测默认情况下,EF会为每个客户返回Broker的新实例,即使重复,它也会为每个代理查询负载代理。

是否有反正我可以使EF不加载经纪人,如果同一个经纪人之前加载? EF中是否存在这种缓存(仅适用于小型继承)或者我必须添加自己的导航属性实现?

回答

2

除非你有一些真正发生的例子,否则对于你的问题的第一部分,我认为你错了。 EF不会为已加载的代理创建新实例。 EF与任何其他ORM工具一样,都使用IdentityMap模式来处理每个加载的对象仅在单个实例中存在。

问题的第二部分比较难,因为它与在数据库上执行的查询有关。我没有检查这与EF,但在Linq-to-Sql查询不同基于加载主要对象的导航属性的数量。如果你只加载了单个导航属性,它通常会执行简单的连接,因此记录被复制。但是在多导航的情况下,查询被分成多个查询,从不同的表中加载数据。所以这种行为在默认情况下有所优化。

+0

IdentityMap很有趣,我不知道这个,但我想这甚至会遇到并发问题,如果两个客户具有相同的代理,导航属性具有相同的代理对象实例?加载一个查询? – 2010-08-27 10:07:13

+1

我没有看到任何并发问题。每个对象上下文处理IdentityMap。对象上下文通常不共享。如果单个线程请求共享单个代理的多个客户,那么代理是由客户之间共享的单个实例代表是自然的。 – 2010-08-27 11:47:30