在MVC应用程序中使用EF延迟加载的真实示例

时间:2016-09-23 12:17:57

标签: asp.net-mvc entity-framework lazy-loading

任何人都可以在MVC应用程序中发布使用EF延迟加载的正确且有用的示例吗?

我试图研究这个问题,但我找不到合适的案例。

因此,我的结论是:由于Web应用程序是无状态的,因此将LL包含在实体中是没有意义的。但这听起来很奇怪。这就是问题在这里的原因。

你能证实或反驳我的结论吗?

修改

在我看来,有问题的“无国籍”语句在我看来很重要。让我们假装2个场景。第一个涉及WPF应用程序,第二个涉及MVC。让我们假设thre是下一个简单的对象:

public class Person 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    ... 
    public virtual List<Activity> Activities { get; set; } 
}

1)WPF。用户可以在没有活动的情况下请求唯一的人员。因此他获得了一小部分数据。开销是合理的。同时用户可以决定请求人的活动。 由于ll机制,EF只是加载活动而不再请求person对象,因为Person仍然存在于应用程序中(当然,如果我们以这种方式编写代码)。

2)MVC。那里也有同样的行动。但唯一的区别是,在服务器响应之后,包括对象Person在内的所有资源都被处理掉了。我们不能像在WPF应用程序中那样加载Person活动。我们被迫再次加载Person(与WPF app相比开销增加)

关键是延迟加载只能在实体所附加的上下文范围内执行 - 如果你处置上下文就不能使用它。

1 个答案:

答案 0 :(得分:2)

我认为您不了解延迟加载的作用,因为它与是否存在任何状态无关。它不像缓存或其他东西。延迟加载只是实体框架重载属性以添加自定义getter,该getter在第一次访问属性时发出查询以获取对象或对象集。

例如,如果您有类似的内容:

public class Foo 
{
    public virtual Bar Bar { get; set; }
}

你要从数据库中查询一组Foo,所有这些Bar属性都是null,因为EF还没有发出任何查询来获取相关{ {1}}实例。但是,如果您要遍历此Bar列表并访问Foo上的某个属性(即Bar),则EF会为{{1}发出即时查询然后,它可以返回foo.Bar.Baz属性。

相关问题