Как переопределить метод DbContext Dispose () в Entity Framework Core? - PullRequest
0 голосов
/ 16 января 2019

У меня есть приложение .NET Core, которое широко использует Entity FrameWork Core. Везде, где требуется DbContext, он создается из фабричного класса, используется и утилизируется, так как его производительность снижается при длительных операциях:

using(var _crmDbContext = this._contextFactory.GetObject())
{
    _crmDbContext.CustomerKpi.RemoveRange(_crmDbContext.CustomerKpi.Where(x => x.CreationDate <= DateTime.UtcNow.Date.AddDays(-days)));
    _crmDbContext.SaveChanges();
}    

Это выполняется тысячи раз в ходе выполнения без проблем.

Для модульного тестирования я полагаюсь на функцию EF в памяти, которая потрясающая. Проблема в том, что из-за всех моих операторов using весь контекст теряется, так как протестированный код каждый раз удаляет его, поэтому я не могу проверить, что на самом деле должно быть в базе данных. Мне нужно переопределить метод Dispose моего в контексте памяти, так что он ничего не делает.

Я думал, что самый очевидный подход - это подкласс мой DbContext класс:

public partial class NonDisposableContext : MyDbContext
{
    public override void Dispose()
    {
        // Do nothing!
    }
}

Теперь проблема в том, что я совершенно не могу привести его к родительскому классу, получая общее исключение приведения. Выдержка из самого модульного теста, используя Moq:

mockedContextFactory.Setup(x => x.GetObject())
                    .Returns(() => (NonDisposableContext)this._365CeContext);  

Я попробовал следующую выдержку, но проблема все еще возникает:

public class MainDbContext : DbContext
{
    public MainDbContext(DbContextOptions<MainDbContext> options)
        : base(options)
    {
    }

    protected MainDbContext(DbContextOptions options)
        : base(options)
    {
    }
}

public class SubDbContext : MainDbContext
{
    public SubDbContext (DbContextOptions<SubDbContext> options)
        : base(options)
    {
    }

    public override void Dispose()
    {
    }
}

Любой намек на то, как успешно создать подкласс для данного DbContext и привести его к родителю?

Спасибо!

...