EF DbContext VS会话生存期

时间:2014-04-06 13:17:32

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first

我首先在电子商务网站上使用Entity Framework代码。我想把篮子存放在会话中。我正在使用Ninject来管理DbContext的生命周期,并且我已根据请求将其范围设置为。

我的问题是因为篮子的生命周期是每个会话,但DbContext的生命周期是每个请求 - 然后篮子不会附加到每个请求的新DbContext实例。

我可以在每个请求上重新实例化篮子,但这似乎效率很低,因为它会获得每个请求的所有篮子细节。

我可以在每个请求开始时重新连接会话的篮子。这似乎是我能看到的最佳解决方案。

处理这种情况的推荐方法是什么?

我发现了其他问题/帖子,询问DbContext的范围,建议使用IOC容器为每个请求使用相同的DbContext。我已经这样做了 - 我还没有找到关于如何将每请求DbContext附加到会话状态中实体的较长生命周期的问题的答案。

1 个答案:

答案 0 :(得分:1)

推荐的方法是不将持久性对象存储在篮子中,而是将一些POCO(普通对象)存储在:

  • 可用于有效显示购物篮的内容
  • 仍然包含数据库ID,因此当接受订单时,您可以使用ID在数据库上下文的当前实例中检索数据库entites

附加和重新附加持久性对象可能会起作用,但是当您最终拥有一个应用程序服务器场并决定将会话保留在数据库中时,必须对持久性对象进行序列化和反序列化,这可能会导致其他问题(只要您的会话由inproc会话提供程序保留,您就不会看到这些问题。)