0

我有一个

public static class Repository

在我的网络表单项目中。

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

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();

在任何例外情况下,我都不应该这样做,因为跨页面访问,不应该有失败查询的痕迹。还是应该?清洁责任在我身上吗?

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

4

2 回答 2

1

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

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

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

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

希望这可以帮助。

于 2013-09-26T13:58:55.580 回答
1

我会认真建议您调查上下文对象的生命周期管理。看看这个优秀的答案,看看你的选择是什么。

于 2013-09-26T14:02:18.710 回答