缓存而在装载实体从数据库对象框架
问题描述:
这里是我的简单结构缓存而在装载实体从数据库对象框架
Customer
CustomerID
FirstName
LastName
...
BrokerID <- Navigation Property created with this FK
Broker
BrokerID
FirstName
LastName
现在的问题是,如果我加载多个客户,我想看看客户的名单,我也需要看与客户关联的经纪人姓名,现在一个经纪人可能会有很多客户,因此返回的多个客户很可能会重复BrokerID。
我猜测默认情况下,EF会为每个客户返回Broker的新实例,即使重复,它也会为每个代理查询负载代理。
是否有反正我可以使EF不加载经纪人,如果同一个经纪人之前加载? EF中是否存在这种缓存(仅适用于小型继承)或者我必须添加自己的导航属性实现?
答
除非你有一些真正发生的例子,否则对于你的问题的第一部分,我认为你错了。 EF不会为已加载的代理创建新实例。 EF与任何其他ORM工具一样,都使用IdentityMap模式来处理每个加载的对象仅在单个实例中存在。
问题的第二部分比较难,因为它与在数据库上执行的查询有关。我没有检查这与EF,但在Linq-to-Sql查询不同基于加载主要对象的导航属性的数量。如果你只加载了单个导航属性,它通常会执行简单的连接,因此记录被复制。但是在多导航的情况下,查询被分成多个查询,从不同的表中加载数据。所以这种行为在默认情况下有所优化。
IdentityMap很有趣,我不知道这个,但我想这甚至会遇到并发问题,如果两个客户具有相同的代理,导航属性具有相同的代理对象实例?加载一个查询? – 2010-08-27 10:07:13
我没有看到任何并发问题。每个对象上下文处理IdentityMap。对象上下文通常不共享。如果单个线程请求共享单个代理的多个客户,那么代理是由客户之间共享的单个实例代表是自然的。 – 2010-08-27 11:47:30