这不是一个好主意。
主要原因是 ORMappers 的工作方式 - 当您混合来自不同上下文的对象时,它们不喜欢它。这将在您建议的场景中发生 - 您在会话中有一个对象,由您的下一个(和后续)请求使用的不同上下文创建。Sonner 或以后你会开始遇到异常。
就我个人而言,我更喜欢一种方法,其中包含客户 ID(可能还有其他属性)的简单对象存储在会话中(或表单 cookie 的自定义数据部分),我将对客户对象的访问包装在一个简单的语句中涉及Items
容器:
(生产代码需要在这里和那里进行一些检查才能更具防御性):
const string CUSTOMERITEM = "customeritem";
public Customer Current
{
get
{
if ( HttpContext.Current.Items[CUSTOMERITEM] == null )
{
int id = retrieve_the_id;
using ( DbContext ctx = GetCurrentDbContext() )
{
HttpContext.Current.Items.Add( CUSTOMERITEM, ctx.Customers.FirstOrDefault( c => c.ID == id );
}
}
return (Customer)HttpContext.Current.Items[CUSTOMERITEM];
}
}
项目容器仅持续一个请求的时间。上面的代码片段确保每个请求只加载一次对象。
当然,与您的方法相比,每个请求需要额外查询一次。但优点是您永远不会弄乱数据库上下文。
请注意,有些业务流程不需要该Customer
对象,但您可以直接传递客户 ID 并在查询中使用:
public IEnumerable<Order> CustomerOrders( int CustomerID )
{
// use the customer id directly, without first loading the customer object
}