2012-02-16 62 views
1

我有一堆简单形式的三层web应用程序。一个列出记录,一个编辑单个记录等。这些作品。我应该在三层应用程序中实例化实体框架的ObjectContext

我有一个DataLayer我的EDMX是。 我有一个应用程序层,我的POCO是。 我有一个BusinessLayer与我所有的控制器类等(不是MVC!) 我有一个用户界面层,我的网络用户界面是。

EDMX有很多很多导航属性的表。 当然,当我在我的一个控制器中获取数据时, GetCustomerById(int id),我创建了Object上下文,并在完成时关闭它。

但是,当我尝试访问UI层中的导航属性时,ObjectContext超出了范围。

我应该在网页层做(using MyContext = new MyContext()) {... } ??这看起来不正确。 我应该从BizLayer的实体数据创建另一组POCO吗? 当我想保存输入网页表单的数据时会发生什么?我会打电话给一个BizLayer控制器,例如SaveCustomer()?

我的问题是,如果我想要能够正确访问实体的导航属性,您如何设计Web UI层?

注意: EDMX设置为LazyLoading。

+0

OMG这个问题一次又一次地回来...... :)看到我的asnwer在这里,这不是最终的真相或唯一的方式去,但我得到了很多共识迄今... http://stackoverflow.com/a/7474357/559144 – 2012-02-16 09:07:34

+0

谢谢。但这不是MVC。对我来说,问题是如果我不想在Web UI中依赖EF,那么我该如何处理POCO以及如何正确访问/保存/编辑它们。 – John 2012-02-16 09:23:02

+0

这是所有在我的答案中解释,它也适用于Web窗体或Windows窗体或WPF,分层如你分离UI从EF,NHibernate等任何依赖... – 2012-02-16 09:26:25

回答

1

你想在UI中使用延迟加载,但这意味着UI定义了你的ObjectContext的生命周期。有许多方法可以在不将UI暴露给用户界面的情况下实现这一点。你可以使用这个简单的方法:

  1. 你提到了一些使用上下文并配置它的控制器。因此,让您的控制器一次性使用,而不是在每个方法中使用上下文来为控制器的整个生命周期使用单个上下文在控制器的Dispose方法中处理上下文。
  2. 按请求实例化您的控制器。因此,例如,您可以在Page.Load中创建控制器实例,并将其置于Page.Unload中。
  3. 根据需要使用您的控制器和实体。请求的全部处理(在LoadUnload之间)将在单身生活的范围内。

无论如何,你不应该需要在Web应用程序中延迟加载太多。在你的表单中,你通常确切地知道你需要什么实体,所以你应该直接用急切的加载请求它们。

相关问题