我首先使用实体框架代码。我的设置是我有一个核心服务,所有其他服务继承。核心服务包含以下代码:
public static DatabaseContext db = new DatabaseContext();
public CoreService()
{
db.Database.Initialize(force: false);
}
然后,另一个类将继承自CoreService,当需要查询数据库时,将只运行一些代码,如:
db.Products.Where(blah => blah.IsEnabled);
然而,我似乎在争论最好的故事。
有些人建议不要做我正在做的事情。
其他人说你应该为每个类定义上下文(而不是使用基类来实例化它)
其他人说,对于每个数据库调用,我都应该将它包装在一个使用块中。我从来没有在微软的任何一个例子中看到这一点。
任何人都可以澄清吗?
我目前正处于重构可能且非常快的阶段,所以如果可能的话,我想要一些一般的建议。
答案 0 :(得分:1)
您应该为每个Web请求包装一个上下文。只要你需要它就把它打开,然后在你完成时把它拿掉。这就是使用的目的。
不要在Singleton中包装你的上下文。这不是一个好主意。
如果您正在与WinForms等客户合作,那么我认为您将围绕每个表单包装上下文,但这不是我的区域。
另外,请确保您知道何时要对数据源执行实际操作,这样您在完成一次处理结果时可能只需要多次枚举。
最后,你已经看过MS的这种做法,因为很多ADO东西支持包含在一个使用中,但几乎没有人意识到这一点。
答案 1 :(得分:0)
我建议使用设计原则“首选组合而不是继承”。 您可以在基类中引用数据库上下文。 实现单例以获取DataContext并将datacontext分配给此引用。
答案 2 :(得分:-1)
您获得的冲突与在类之间共享上下文无关,而是由您的上下文的static
声明引起的。如果您将上下文设置为服务类的 instance 字段,以便每个服务实例都有自己的上下文,那么应该没有问题。
您提到的using
模式不是必需的,但您应该确保在服务处理中调用context.Dispose()
。