【问题标题】:Loading from database without proxy classes?从没有代理类的数据库加载?
【发布时间】:2011-10-04 22:01:25
【问题描述】:

在 Entity Framework 4 中是否可以选择在不使用代理类的情况下将一些查询加载到 POCO 中? (为了缓存该对象以供将来只读使用)。我正在使用存储库 - 服务模式。

我的意思是:

var order = _orderService.GetById(1);
// after order is loaded then we can see in the debugger that:
// order.Customer is of type System.Data.Entity.DynamicProxy.Customer_17631AJG_etc

我想要的是 order.Customer 实际使用 POCO 类型 MyApp.Models.Entities.Customer 而不是该类型的代理。

编辑:根据 Ladislav 向存储库添加“GetUnproxied”方法的建议,我进行了以下更改:

// this is the current method that must return a DynamicProxy
public IQueryable<T> GetQuery()
{
    return ObjectSet.AsQueryable();
}

// this is the new additional method that must return the plain POCO
public IQueryable<T> GetReadOnly()
{
    ObjectContext.ContextOptions.ProxyCreationEnabled = false;
    var readOnly = ObjectSet.AsQueryable();
    ObjectContext.ContextOptions.ProxyCreationEnabled = true;
    return readOnly;
}

这是正确的吗?

对我来说,它看起来不是线程安全的。两种方法都使用相同的 ObjectContext 实例,因此ProxyCreationEnabled == false 可能发生在一个线程上,然后public IQueryable&lt;T&gt; GetQuery() 可能在另一个线程上被调用——这突然意味着代理方法可以返回非代理对象。

【问题讨论】:

  • 我假设您通过将“服务引用”添加到您的项目来使用 WCF 生成的代理。这是正确的吗?
  • @Yigit 啊,不,我正在使用 T4 模板来生成我的 POCO 类。与 WCF 无关。我的意思是,当我使用 objectcontext.Get() 时,它将 POCO 的属性加载为代理类而不是实际的 POCO 类

标签: c# entity-framework poco proxy-classes


【解决方案1】:

在查询数据之前使用它来关闭代理创建

context.ContextOptions.ProxyCreationEnabled = false;

我认为它也可以在 EDMX 设计器中全局关闭。

更新:

这适用于ObjectContextDbContext 的代码是:

context.Configuration.ProxyCreationEnabled = false;

另外我在 edmx 设计器中没有看到任何选项

【讨论】:

  • 更新的问题有两种存储库方法,一种代理,一种没有。如果它是正确的,你能评论一下吗,它看起来对我来说不是线程安全的。
  • 是的,它应该以这种方式工作。我不明白您对“线程安全”的评论。 EF 中没有任何内容是线程安全的,并且不应在线程之间共享上下文!
  • 我刚刚测试过——逐行调试,它调用了GetReadOnly()方法,但它仍然返回一个动态代理,为什么要这样做?调用 GetReadOnly 的代码是:return _currencyRepository.GetReadOnly().Where(c =&gt; c.CurrencyCode == defaultCurrencyCode).FirstOrDefault();。它确实执行了ProxyCreationEnabled = false 行,所以我不确定为什么它仍然是代理。
  • 我明白了,这是因为延迟查询执行。您不能返回 IQuerybale - 您必须在将代理创建设置回 true 之前执行查询。
  • @LadislavMrnka 我以为FirstOrDefault() 确实执行了查询?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2012-03-30
相关资源
最近更新 更多