我应该在 3 层应用程序中在哪里实例化实体框架的 ObjectContext
我有一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您希望在 UI 中使用延迟加载,但这意味着 UI 定义了
ObjectContext
的生命周期。有很多方法可以在不向 UI 公开上下文的情况下实现此目的。例如,您可以使用这种简单的方法:Dispose
方法中释放上下文。Page.Load
中创建控制器实例,并将其处置在Page.Unload
中。Load
和Unload
之间)将在单个活动上下文的范围内。无论如何,您不应该在 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:Dispose
method.Page.Load
and dispose it inPage.Unload
.Load
andUnload
) 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.