Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF DbContext与会话生存期_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Ef Code First - Fatal编程技术网

C# EF DbContext与会话生存期

C# EF DbContext与会话生存期,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,ef-code-first,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Ef Code First,我首先为一个电子商务网站使用实体框架代码。我想在会话中存储篮子。我使用Ninject来管理DbContext的生命周期,并将其范围设置为每个请求 我的问题是,因为篮子的生存期是每个会话,而DbContext的生存期是每个请求,所以篮子不会附加到每个请求的新DbContext实例 我可以在每个请求上重新实例化篮子,但这似乎效率很低,因为它将获得每个请求的所有篮子细节 我可以在每次请求开始时重新连接会话篮。据我所见,这似乎是最好的解决办法 处理这种情况的推荐方法是什么 我还发现了其他一些问题/帖子,

我首先为一个电子商务网站使用实体框架代码。我想在会话中存储篮子。我使用Ninject来管理DbContext的生命周期,并将其范围设置为每个请求

我的问题是,因为篮子的生存期是每个会话,而DbContext的生存期是每个请求,所以篮子不会附加到每个请求的新DbContext实例

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

我可以在每次请求开始时重新连接会话篮。据我所见,这似乎是最好的解决办法

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


我还发现了其他一些问题/帖子,其中询问了DbContext的范围,建议使用IOC容器在每个请求中使用相同的DbContext。不过,我已经在这样做了——我还没有找到关于如何将每个请求的DbContext连接到会话状态下实体的较长生存期的问题的答案。

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

  • 可用于高效地显示篮子中的内容
  • 仍然包含数据库ID,以便在接受订单时,可以使用ID在数据库上下文的当前实例中检索数据库实体

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

我不确定我的“篮子”和您对POCO对象的描述之间有什么区别。我仍然需要跨请求保存这些数据。关于多个web服务器,这一点非常好-我在决定走哪条路线时会牢记这一点。@Dan:我不知道您的“篮子”是什么是。我假设它包含持久化对象,正如您所说的,您希望“附加它”。不需要“持久化”如果您将数据放入
会话
容器中,则将POCO放入其中,而不是持久性对象。我的篮子只是一个EF实体。我首先使用代码,所以这实际上只是一个POCO对象。我正在会话中存储对它的引用。我不确定您对“持久性对象”的定义。我正在放入我还可以将它提交到数据库,因为它是一个EF实体(即引用了我的DbContext类)。但它仍然只是一个POCO对象,即使EF可以跟踪它。@Dan:从技术上讲,它是POCO,但您真正从EF获得的是POCO的代理,其中导航属性被自动实现以允许延迟加载。实际上,这不是POCO。如果ASP试图用数据库会话提供程序序列化它,您会遇到麻烦。所以听起来我可以只在会话中存储现有Basket类的一个实例,但决不将其附加到DbContext。这样,它仍然只是一个POCO对象。为此创建另一个相同的类没有意义。实际上,我在写入数据库时仍必须附加它(或者创建它的副本,我认为这是您建议的),但在我将其写入数据库时只附加它(或副本),确保它不会保持附加状态。。。