任何人都可以在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相比开销增加)
关键是延迟加载只能在实体所附加的上下文范围内执行 - 如果你处置上下文就不能使用它。
答案 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
属性。