我有一个 MVC 应用程序,它也使用 EF 和一个简单的工作单元模式实现。这是我的UnitOfWork
样子:
public class UnitOfWork : IUnitOfWork
{
[ThreadStatic]
private static UnitOfWork _current;
private MyContext _context;
public static UnitOfWork Current
{
get { return _current; }
}
public UnitOfWork()
{
_current = this;
}
public MyContext GetContext()
{
if(_context == null)
_context = new MyContext();
return _context;
}
public int Commit()
{
return _context == null ? 0 : _context.SaveChanges();
}
public void Dispose()
{
_current = null;
if(_context != null)
_context.Dispose();
}
}
我有一个通用存储库,它封装了常见的数据库操作:
public class GenericRepository<TEntity, TEntityKey> where TEntity : class
{
private MyContext _context;
private MyContext Context
{
get { return _context ?? (_context = UnitOfWork.Current.GetContext()); }
}
public void Add(TEntity newEntity)
{
_context.Set<TEntity>().Add(newEntity);
}
//Other methods...
}
如何使用:
using(var unitOfWork = _unitOfWorkFactory.Create())
{
_repository.Add(newEntity);
unitOfWork.Commit();
}
因此,问题是 MVC 框架是否有可能在处理请求时在内部切换线程。由于当前UnitOfWork
是线程静态的,所以这样的开关会NullReferenceException
在调用时引起UnitOfWork.Current
(如果我不对,请更正)。