我应该在 3 层应用程序中的何处实例化实体框架的对象上下文



我有一个三层的web应用程序,它有很多简单的表单。一个用来列出记录,一个用来编辑单个记录,等等。

我的EDMX所在的位置有一个DataLayer。我有一个应用层,我的POCO就在那里。我拥有一个拥有所有控制器类等的BusinessLayer(不是MVC!)我有一个UI层,我的web UI在那里。

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

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

我应该在web层中执行(using MyContext = new MyContext()) {... }吗??这似乎不对。我应该从BizLayer的实体数据中创建另一组POCO吗?当我想保存在web表单中输入的数据时会发生什么?我会调用BizLayer控制器吗?例如SaveCustomer()?

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

注:EDMX设置为LazyLoading。

您希望在UI中使用延迟加载,但这意味着UI定义了ObjectContext的生存期。有很多方法可以在不向UI公开上下文的情况下实现这一点。例如,您可以使用以下简单方法:

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

无论如何,您不应该太需要在Web应用程序中进行懒惰加载。在你的表单中,你通常确切地知道你需要什么实体,所以你应该通过热切的加载直接请求它们。

最新更新