【问题标题】:EF 4 - Lazy Loading Without ProxiesEF 4 - 没有代理的延迟加载
【发布时间】:2012-03-30 03:28:54
【问题描述】:

我已经读到,当我们需要使用延迟加载和更改跟踪时会使用代理。换句话说,要使用延迟加载,我必须启用代理。

到目前为止一切顺利。

关键是我可以使用下面的代码来设置上下文以不使用代理,甚至使用延迟加载。

ctx = new SchoolEntities();
ctx.ContextOptions.ProxyCreationEnabled = false;
ctx.ContextOptions.LazyLoadingEnabled = true;

ProxyCreationEnabled 属性仅与更改跟踪代理相关还是我遗漏了什么?

有人可以详细解释一下吗?

谢谢!

EDIT1

我没有使用 POCO/DbContext。我正在使用带有 ObjectContext 的常规 edmx EF 模型。我知道 POCO 实体代理对于更改跟踪和延迟加载的重要性。为什么要在常规 EDMX 模型中使用代理?

【问题讨论】:

    标签: c# asp.net entity-framework entity-framework-4


    【解决方案1】:

    使用具有 Entity Framework 内置功能的 POCO 实体时,必须启用代理创建才能使用延迟加载。因此,对于 POCO 实体,如果 ProxyCreationEnabled 为 false,则即使 LazyLoadingEnabled 设置为 true,也不会发生延迟加载。

    对于某些类型的遗留实体(尤其是那些从 EntityObject 派生的实体),情况并非如此,即使 ProxyCreationEnabled 设置为 false,延迟加载也会起作用。但不要认为这意味着你应该使用 EntityObject 实体——这会让你更加痛苦。

    当您想要确保 EF 永远不会创建代理时,ProxyCreationEnabled 标志通常设置为 false,可能是因为这会导致您正在执行的序列化类型出现问题。

    LazyLoadingEnabled 标志通常用于控制是否在您确定代理正常后在上下文范围内发生延迟加载。因此,例如,您可能希望使用代理进行更改跟踪,但关闭延迟加载。

    【讨论】:

    • 我会记住EntityObject 是一个“遗留实体”:) 你什么时候开始用[Obsolete] 属性标记它?
    • 好问题。我无法回答,因为我不知道它是否以及何时会发生。但我们已经讨论过了。
    • @ajcvickers,感谢您的回复,但是,除非我理解不正确,否则我认为错过了问题中最重要的部分:如果我使用的是 ObjectContext(而不是 DbContext), ProxyCreationEnabled 的用途是什么?启用更改跟踪?我之前说过,这不是为了延迟加载,那么,它是干什么用的?
    • @rperson 如果 EF 可以为对象创建代理,那么它将这样做,除非 ProxyCreationEnabled 设置为 false,在这种情况下它不会。你真的在问代理是什么以及它们是如何工作的,或者这个标志是做什么用的?如果是前者,请查看:blog.oneunicorn.com/2011/12/05/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多