代码之家  ›  专栏  ›  技术社区  ›  Akash Kava

在实体框架中从数据库加载对象时缓存

  •  0
  • Akash Kava  · 技术社区  · 15 年前

    这是我最简单的结构

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

    现在我的问题是,如果我加载多个客户,我想查看客户列表,我还需要查看与客户关联的代理的名称,现在一个代理可能会有很多客户,所以返回的多个客户很可能会有重复的代理。

    如果以前加载了同一个代理,我是否可以使EF不加载代理?EF中是否存在这种缓存(仅适用于小型sessoin),或者我必须添加自己的导航属性实现?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Ladislav Mrnka    15 年前

    除非你能举出一个真正发生这种事的例子,否则在你问题的第一部分,我相信你错了。EF不会为已加载的代理创建新实例。EF和其他ORM工具一样,使用IdentityMap模式来处理每个加载的对象只存在于单个实例中。

    问题的第二部分比较困难,因为它与在数据库上执行的查询有关。我没有用EF检查这一点,但是在linqtosql中,根据加载了main对象的导航属性的数量,查询是不同的。如果您只加载了一个导航属性,那么它通常会执行简单的join,这样记录就会被复制。但在多个导航属性的情况下,查询被划分为多个查询,从不同的表加载数据。所以这个行为在默认情况下被优化了。