从没有代理类的数据库加载

本文关键字:数据库 加载 代理 | 更新日期: 2023-09-27 18:02:32

在实体框架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关于在Repository中添加"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<T> GetQuery()在另一个线程上被调用-这将突然意味着代理方法可以返回非代理对象。

从没有代理类的数据库加载

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

context.ContextOptions.ProxyCreationEnabled = false;

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

更新:

这适用于ObjectContext。对于DbContext,代码是:

context.Configuration.ProxyCreationEnabled = false;

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