我有一个.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
子类别并将其转换为父项的任何提示吗?
谢谢!