C# 关于在会话中存储整个LINQ对象的想法?

C# 关于在会话中存储整个LINQ对象的想法?,c#,asp.net,linq,oop,session,C#,Asp.net,Linq,Oop,Session,我想得到一些关于您将整个对象存储到会话中的想法的反馈?例如,客户对象。一旦客户登录到他们的控制面板,而不是每次需要从会话中存储的ID重新获取数据时,将整个客户对象存储在会话中的利弊是什么 因此,只要您需要引用customer对象,就可以执行以下操作: Customer c = (Customer)Session["objCustomer"]; 显然,您需要检查并使用一个刷新会话的函数。如果是空会话或在进行更新后,您需要运行此函数 除此之外,我还应该注意其他问题吗?就编程而言,这似乎要好得多,而

我想得到一些关于您将整个对象存储到会话中的想法的反馈?例如,客户对象。一旦客户登录到他们的控制面板,而不是每次需要从会话中存储的ID重新获取数据时,将整个客户对象存储在会话中的利弊是什么

因此,只要您需要引用customer对象,就可以执行以下操作:

Customer c = (Customer)Session["objCustomer"];
显然,您需要检查并使用一个刷新会话的函数。如果是空会话或在进行更新后,您需要运行此函数


除此之外,我还应该注意其他问题吗?就编程而言,这似乎要好得多,而且对数据库的调用也要少得多。有人想过吗?

这不是个好主意

主要原因是ORMappers的工作方式——他们不喜欢混合来自不同上下文的对象。这将发生在您提议的场景中—会话中有一个对象,由下一个(和后续)请求使用的不同上下文创建。Sonner或更晚,您将开始获得异常

就我个人而言,我更喜欢将包含客户ID(可能还有其他属性)的简单对象存储在会话(或表单cookie的自定义数据部分)中的方法,并将对客户对象的访问封装在一个简单语句中,该语句涉及
容器:

(一个生产代码需要在这里和那里进行少量检查,以便更具防御性):

Items容器仅在一次请求时有效。上面的代码段确保每个请求只加载一次对象

当然,与您的方法相比,每个请求需要额外查询一次。但优点是,您永远不会弄乱数据库上下文

请注意,有些业务流程不需要
Customer
对象,但您可以直接传递客户ID并在查询中使用:

 public IEnumerable<Order> CustomerOrders( int CustomerID ) 
 {
     // use the customer id directly, without first loading the customer object
 }
public IEnumerable CustomerOrder(int-CustomerID)
{
//直接使用客户id,无需首先加载客户对象
}

我遇到了Wiktor在另一个答案中描述的问题。我使用NHibernate,如果您在会话中存储对象,您将遇到比较对象的问题、与断开的会话的问题等。尽管如此,我还是继续在会话中存储对象。我只是确保它们都实现自己的Equals()和GetHashCode()函数。这样我就可以比较不同会话中的对象,看看它们是否是同一个对象。我习惯使用
obj1.Equals(obj2)
而不是
obj1==obj2


当然,总有一些折衷的办法——与增加代码的复杂性相比,您可以获得不必重复查询的速度。哪条路对你合适取决于你的具体情况。

梅拉莫克我同意你的观点,即引进你需要的房产。您可以通过调整模型来实现这一点,还可以关闭延迟加载。除此之外,我认为它相当安全。除非我们将所有这些对象都存储为引用,否则在会话中放置这些对象之后,它们自身就没有问题了。唯一可能导致问题的时间是两个上下文都在范围内。

您需要格外小心,不要试图遵循对象的延迟加载属性。在我看来,最好创建一个只包含定期需要的属性的POCO对象,并将其存储在会话中,而不是整个LINQ对象中。您需要一个自定义对象来存储应用程序中的状态,并与实际数据库断开连接。你不希望表达式树和延迟计算的属性与状态性混合在一起。另外,我认为这是一个坏主意,因为后面的人可能会尝试更新对象,并在处理上下文时出错。POCO方法具有定义良好且可搜索的机制,用于将数据与上下文内联带回,以便您可以在数据库中对其进行操作。因此,从长远来看,在app.mellamokb中就不会那么糟糕了——在您自己的应用程序中,您是否使用了将POCO对象存储在会话中并引用该对象的方法?还是每次需要对象时都要查询数据库?还是其他方式?请为你的做法提供理由。
 public IEnumerable<Order> CustomerOrders( int CustomerID ) 
 {
     // use the customer id directly, without first loading the customer object
 }