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

发布于 2025-01-06 07:14:07 字数 634 浏览 0 评论 0原文

我有一个 3 层 Web 应用程序,其中包含一堆简单的表单。一种用于列出记录,一种用于编辑单个记录,等等。

我的 EDMX 所在的位置有一个 DataLayer。 我的 POCO 所在的位置有一个应用程序层。 我有一个包含所有控制器类等的 BusinessLayer(不是 MVC!) 我的 Web UI 所在的位置有一个 UI 层。

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

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

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

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

注意: EDMX 设置为 LazyLoading。

I have a 3-tier web application wit ha bunch of simple forms. One to list records, one to edit a single record, etc. The works.

I have a DataLayer where my EDMX is.
I have an App Layer where my POCOs are.
I haev a BusinessLayer with all my controller classes, etc. (not MVC!)
I have a UI layer where my web UI is.

The EDMX has many, many tables wit ha lot of navigation properties.
Of course, when I fetch the data in one of my controllers, e.g. GetCustomerById(int id), I create the Object context and close it when I'm done.

However, the ObjectContext is out of scope when I try to access the navigation properties in the UI layer.

Should I do (using MyContext = new MyContext()) {... } in the web layer?? that does not seem right.
Should I create another set of POCOs that I populate from the entities' data from the BizLayer?
What happens when I want to save data entered in a web form? Would I call a BizLayer controller e.g. SaveCustomer()?

My question is, how do you design the web UI layer if I want to be able to properly access the navigation properties of an entity?

Note:
EDMX is set to LazyLoading.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青柠芒果 2025-01-13 07:14:07

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

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

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

You want to use lazy loading in UI but it means that UI defines lifetime of your ObjectContext. There are many ways to achieve this without exposing the context to UI. You can for example use this simple approach:

  1. You mentioned some controller which uses context and disposes it. So make your controller disposable and instead of disposing context in every method use single context for whole lifetime of the controller. Dispose the context in controller's Dispose method.
  2. Instantiate your controller per request. So for example you can create instance of controller in Page.Load and dispose it in Page.Unload.
  3. Use your controller and entities as you want. Whole processing of the request (between Load and Unload) will be in scope of single living context.

Anyway you should not need lazy loading in Web application too much. In your form you usually know exactly what entities you need so you should request them directly with eager loading.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文