gpt4 book ai didi

c# - 从没有代理类的数据库加载?

转载 作者:太空狗 更新时间:2023-10-29 19:58:49 24 4
gpt4 key购买 nike

在 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<T> GetQuery()在另一个线程上调用 - 这突然意味着代理方法可以返回非代理对象。

最佳答案

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

context.ContextOptions.ProxyCreationEnabled = false;

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

更新:

这适用于 ObjectContext。使用 DbContext 的代码是:

context.Configuration.ProxyCreationEnabled = false;

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

关于c# - 从没有代理类的数据库加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com