1

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

4

0 回答 0