У меня есть приложение .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
и привести его к родителю?
Спасибо!