我有一个软件产品,该数据库是在SQLServer上创建的,表和列名由开发团队定义,然后使用Database First方法将模型导入Visual Studio,现在我们正在开发相同类型的解决方案其他公司使用ORACLE并请求表和列的命名约定,以便不更改现有代码并使用代码优先方法,我使用所有类的[Column]属性创建了具有正确命名约定的DbContext属性,但现在我正在尝试创建一个接口,以便我们可以注入不同的DbContext,并在将来我们有一个更灵活的解决方案。
我是.Net的新手,但我的方法是为DbContext创建一个抽象类,并为每个表示表的类提供一个接口,这样在每个类的实现中我都可以更改表和列的名称如有必要。我的问题是,这可能吗?并且是一个很好的方法吗?
答案 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
类型的变量使用IMyContext
和T
功能。
答案 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