我有一个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
(如果我不正确,请更正)。