0

在使用EF5 DbContext后更改配置后出现问题。我正在使用POCO T4模板。下面是这种情况:忽略EF5 DBContext配置

  • 我查询了一套在我的背景,并得到与他们的关系动态代理对象
  • 我修改上下文的配置,以禁用动态代理和延迟加载这样的:

    context.Configuration.ProxyCreationEnabled = false; 
    context.Configuration.LazyLoadingEnabled = false; 
    
  • 我再一组再次查询并获得相同的一种代理和关系的结果。

在上下文初始化之后需要做什么才能将配置考虑在内?可能吗?

在此先感谢!

回答

1

如果您查询一组,禁用代理的创建,并再次查询同一组你有很大的机会获得代理实体反正。原因是上下文内部使用的身份映射。每个实体只能被上下文跟踪一次。因此,如果您在启用代理创建的情况下查询集合,则EF将为从数据库加载的每个唯一记录创建具有动态代理的实体实例。当禁用代理创建后再次查询该集合时,EF将重新使用所有已创建的实体(及其代理),并为没有动态代理的只创建尚未加载的记录创建新实体。

如果你想避免这些代理你必须:

  • 第一查询
  • 使用第二查询新的上下文之前关闭代理创建

你也可以尝试使用AsNoTracking()但我怀疑它不起作用。

+0

而且......它的工作原理!我的问题是,在我的DDD实现中,使用依赖注入和不同的抽象层,我不能轻松更新上下文,也不能关闭整个操作的代理(因为它也会禁用延迟加载)。但使用AsNoTracking()和禁用代理创建,我的POCO类型被保留。实际上,AsNoTracking()将动态代理转换为初始POCO类型。但要小心,它似乎本身只与Json序列化,而不是XML。 – Paul 2013-02-19 09:58:07