我首先使用代码处理asp.net mvc。我注意到,一旦我创建了一个新的控制器,控制器模板就显示了一个只有一个工作的dispose重写方法;在此控制器顶部创建的dispose db变量。
我正在考虑将此更改为使用我的DBContext类的单例模式。
我尝试过它并且工作正常。除了我有时需要从global.asax访问数据库。 (有时)会引发异常。
有人想过这样做吗?有什么想法吗?
谢谢
答案 0 :(得分:0)
我个人会采用完全不同的方法,请参阅我的答案:https://stackoverflow.com/a/7474357/559144我不会使用Singleton,也不会将带有DAL的UI框架MVC(在您的情况下为EF)硬连接。
关于不使用singleton,让数据库处理并发;这是数据库服务器做得最好的事情之一; - )
答案 1 :(得分:0)
我们使用EF上下文作为每个http上下文的单例。我也不会将EF与MVC硬链接,但您仍然可以确保每个http上下文通过使用依赖注入来处理单个EF上下文实例(我们使用Unity)。
我们还访问全局asax中的上下文来进行数据库初始化和接种以进行开发。同样,您可以使用DI容器来获取EF上下文的实例。
public interface IUnitOfWork : IDisposable
{
int SaveChanges();
}
public class MyEfContext : DbContext, IUnitOfWork
{
// your custom context code
}
在IUnitOfWork依赖注入中使用单个每个http的上下文生存期不是一种帮助处理并发性的方法。我们这样做是因为在处理EF实体时,我们需要确保所有选择/插入/更新/删除始终使用相同的上下文实例。 EF不允许您将实体附加到多个上下文,因此我们在每个http上下文中使用单例。