如何在Entity Framework Core中覆盖DbContext Dispose()方法?

时间:2019-01-16 18:13:11

标签: c# casting entity-framework-core dispose subclassing

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

谢谢!

0 个答案:

没有答案