我有一个
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();
任何异常,我不应该,因为跨页面访问,应该没有失败的查询的痕迹。还是应该呢?我的清洁责任是什么?
这些问题不应该是因为我使用静态(请说它不是那样),它是否与实体框架连接池相关?
答案 0 :(得分:1)
一般来说,实体框架上下文是短暂的 - 即它通常被视为一个工作单元,您可以为特定任务创建它并在最后处置它。它是一个轻量级的物体,应该以这种方式使用。
您发出的问题是对象长期存在(即在跨请求共享的单例中)。在这种情况下,上下文的内部状态变得无效 - 即您尝试删除某些内容,它无法将这些更改持久保存到数据库中,因此处于无效状态。
您可以通过在每种情况下使用对象之前调用refresh方法来解决您的问题 - 这将导致对象基于数据库更新其状态 - 但这可能会导致其他问题。
但是,这是错误的做法 - 应根据请求创建,使用和处理上下文。
希望这有帮助。
答案 1 :(得分:1)
我会认真建议您调查上下文对象的生命周期管理。 看看this excellent answer您的选择是什么。