我应该在哪里实例化3层应用程序中的实体框架的ObjectContext

时间:2012-02-16 09:04:11

标签: asp.net .net entity-framework-4 edmx objectcontext

我有一个3层的Web应用程序,有很多简单的表单。一个用于列出记录,一个用于编辑单个记录,等等。工作。

我有一个我的EDMX所在的DataLayer。 我有一个应用层,我的POCO在哪里。 我拥有所有控制器类等的BusinessLayer(不是MVC!) 我有一个用于界面的UI图层。

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

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

我应该在网络层中做(using MyContext = new MyContext()) {... }吗?这似乎不对。 我应该创建另一组POCO,我从BizLayer的实体数据填充吗? 当我想保存在Web表单中输入的数据时会发生什么?我会打电话给BizLayer控制器,例如SaveCustomer()?

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

注意: EDMX设置为LazyLoading。

1 个答案:

答案 0 :(得分:1)

您希望在UI中使用延迟加载,但这意味着UI定义了ObjectContext的生命周期。有很多方法可以实现这一点,而不会将上下文暴露给UI。例如,您可以使用这种简单的方法:

  1. 您提到了一些使用上下文并处理它的控制器。因此,在控制器的整个使用寿命期间,不要在每种方法中使用单个上下文来处理控制器的一次性操作。在控制器的Dispose方法中处理上下文。
  2. 按请求实例化您的控制器。例如,您可以在Page.Load中创建控制器实例并将其置于Page.Unload
  3. 根据需要使用您的控制器和实体。请求的整个处理(LoadUnload之间)将在单一生活环境的范围内。
  4. 无论如何,你不应该在Web应用程序中过多地延迟加载。在您的表单中,您通常确切地知道您需要哪些实体,因此您应该直接请求它们。