在webforms项目中使用静态Repository类重用实体框架连接?

时间:2013-09-26 11:59:16

标签: entity-framework webforms

我有一个

public static class Repository

在我的webforms项目中。

在该类的静态块中,我设置了我的实体框架实体对象:

private static readonly ProjectEntities db;
static Repository()
{
  db = new ProjectEntities("Name=ProjectEntities");
}

然后我设置了一些像这样的公共静态方法:

public static Order GetOrder(int orderID)
{
  return db.Orders.First(o => o.OrderID == orderID);
}

问题在于,当例如删除失败时(由于某些约束),我会在后续连接中随机获取一些线索,由于应该是无辜的查询而出现异常。例如,由于选择查询而导致删除的例外情况。

我从不

db.AcceptAllChanges();

任何异常,我不应该,因为跨页面访问,应该没有失败的查询的痕迹。还是应该呢?我的清洁责任是什么?

这些问题不应该是因为我使用静态(请说它不是那样),它是否与实体框架连接池相关?

2 个答案:

答案 0 :(得分:1)

一般来说,实体框架上下文是短暂的 - 即它通常被视为一个工作单元,您可以为特定任务创建它并在最后处置它。它是一个轻量级的物体,应该以这种方式使用。

您发出的问题是对象长期存在(即在跨请求共享的单例中)。在这种情况下,上下文的内部状态变得无效 - 即您尝试删除某些内容,它无法将这些更改持久保存到数据库中,因此处于无效状态。

您可以通过在每种情况下使用对象之前调用refresh方法来解决您的问题 - 这将导致对象基于数据库更新其状态 - 但这可能会导致其他问题。

但是,这是错误的做法 - 应根据请求创建,使用和处理上下文。

希望这有帮助。

答案 1 :(得分:1)

我会认真建议您调查上下文对象的生命周期管理。 看看this excellent answer您的选择是什么。