是否可以创建DbContext接口或抽象类并使用它来注入不同的DbContext对象?

时间:2016-06-14 16:30:10

标签: c# asp.net entity-framework

我有一个软件产品,该数据库是在SQLServer上创建的,表和列名由开发团队定义,然后使用Database First方法将模型导入Visual Studio,现在我们正在开发相同类型的解决方案其他公司使用ORACLE并请求表和列的命名约定,以便不更改现有代码并使用代码优先方法,我使用所有类的[Column]属性创建了具有正确命名约定的DbContext属性,但现在我正在尝试创建一个接口,以便我们可以注入不同的DbContext,并在将来我们有一个更灵活的解决方案。

我是.Net的新手,但我的方法是为DbContext创建一个抽象类,并为每个表示表的类提供一个接口,这样在每个类的实现中我都可以更改表和列的名称如有必要。我的问题是,这可能吗?并且是一个很好的方法吗?

3 个答案:

答案 0 :(得分:2)

不,没有。但是你总是可以建立一个这样的:

interface IDbContext : IDisposable
{
    DbSet<TEntity> Set<TEntity>() where TEntity : class;

    Task<int> SaveChangesAsync();
}

public class MyDbContext : DbContext, IDbContext
{
    public MyDbContext()
        : base("myConnectionString")
    { }

    //implementation
}

在需要时注入IDbContext

答案 1 :(得分:0)

您可以使用具有多个类型参数约束的泛型类,例如,使用约束类型的公共属性来注入DbContext

class Stuff<T> where T : DbContext, IMyContext
{
    public T Context { get; set; }
    // other members
}

这使您可以对DbContext类型的变量使用IMyContextT功能。

答案 2 :(得分:0)

老问题,不同的上下文(没有双关语),但似乎至少出于单元测试的目的,一段时间以来可以通过其接口注入数据库上下文。 https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2#add-dependency-injection