Asp.net Web Api EF DBContext

296
23 мая 2017, 00:13

Всем привет. Проект на Asp.Net Web Api, для работы с бд использую EF. Есть класс UnitOfWork:

public class UnitOfWork : IUnitOfWork
{
    private static ApplicationDbContext _context = new ApplicationDbContext();
    private CategoryRepository _categoryRepository;
    private IGenericRepository<Image> _imageRepository;
    private IGenericRepository<Post> _postRepository;
    private IGenericRepository<PostComment> _postCommentRepository;
    private IGenericRepository<Project> _projectRepository;
    private IGenericRepository<ProjectComment> _projectCommentRepository;
    private TagRepository _tagRepository;
    public CategoryRepository CategoryRepository
    {
        get
        {
            if (_categoryRepository == null)
            {
                _categoryRepository = new CategoryRepository(_context);
            }
            return _categoryRepository;
        }
    }
    public IGenericRepository<Image> ImageRepository
    {
        get
        {
            if (_imageRepository == null)
            {
                _imageRepository = new GenericRepository<Image>(_context);
            }
            return _imageRepository;
        }
    }
    public IGenericRepository<Post> PostRepository
    {
        get
        {
            if (_postRepository == null)
            {
                _postRepository = new GenericRepository<Post>(_context);
            }
            return _postRepository;
        }
    }
    public IGenericRepository<PostComment> PostCommentRepository
    {
        get
        {
            if (_postCommentRepository == null)
            {
                _postCommentRepository = new GenericRepository<PostComment>(_context);
            }
            return _postCommentRepository;
        }
    }
    public IGenericRepository<Project> ProjectRepository
    {
        get
        {
            if (_projectRepository == null)
            {
                _projectRepository = new GenericRepository<Project>(_context);
            }
            return _projectRepository;
        }
    }
    public IGenericRepository<ProjectComment> ProjectCommentRepository
    {
        get
        {
            if (_projectCommentRepository == null)
            {
                _projectCommentRepository = new GenericRepository<ProjectComment>(_context);
            }
            return _projectCommentRepository;
        }
    }
    public TagRepository TagRepository
    {
        get
        {
            if (_tagRepository == null)
            {
                _tagRepository = new TagRepository(_context);
            }
            return _tagRepository;
        }
    }
    public void Save()
    {
        _context.SaveChanges();
    }
    private bool _disposed = false;
    protected virtual void Dispose(bool disposing)
    {
        if (!this._disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
        }
        this._disposed = true;
    }
    public void Dispose()
    {
        NLog.LogManager.GetCurrentClassLogger().Info("YEEEESSS  I'M DISPOSE");
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

С помощью kernel я его инжекчю в контроллеры:

kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();

Первый запрос обрабатывается хорошо. Но после 2 появляется ошибка

System.InvalidOperationException: 'The operation cannot be completed because the DbContext has been disposed.'

Ссылка на проект: GitHub

Буду рад правильной критике.

Answer 1

У тебя поле _context static. При удалении объекта, у контекста вызывается dispose, а при следующем запросе, у нового объекта старый контекст. Из-за этого и возникает ошибка. Просто удали static.

READ ALSO
Помогите перевести процедуру с Delphi на c#

Помогите перевести процедуру с Delphi на c#

Вот эту процедуру не могу понятьОна должна читать из бинарного потока данные и заполнять ими поле Text

279
Передать текст для печати в делегат (консольное приложение)

Передать текст для печати в делегат (консольное приложение)

Вот есть пример, как вывести на печать текст, а как передать в PD_PrintPage мою структуру Transfer?

310
Изменить меню приложения

Изменить меню приложения

Можно ли с помощью WinApi или UIAutomation изменять названия пунктов меню стороннего приложения (WPF)?

241
Работа в спящем режиме на Android, Xamarin/C#

Работа в спящем режиме на Android, Xamarin/C#

Программа работает, пока устройство активно, как только экран гаснет, программа так же засыпаетКак заставить программу работать в фоновом...

252