C# efcore中抽象泛型DbContext类的设计
我在使用EF Core实现抽象泛型基类时遇到问题。这可能是显而易见的,但我没有看到 基类:C# efcore中抽象泛型DbContext类的设计,c#,entity-framework,generics,entity-framework-core,C#,Entity Framework,Generics,Entity Framework Core,我在使用EF Core实现抽象泛型基类时遇到问题。这可能是显而易见的,但我没有看到 基类: public abstract class AContext<TUser> : IdentityDbContext<TUser> where TUser : IdentityUser { public AContext(DbContextOptions<AContext<TUser>> options, ILogger<AContext
public abstract class AContext<TUser> : IdentityDbContext<TUser>
where TUser : IdentityUser {
public AContext(DbContextOptions<AContext<TUser>> options, ILogger<AContext<TUser>> logger)
: base(options) {
}
}
公共抽象类AContext:IdentityDbContext
在哪里TUser:IdentityUser{
公共AContext(DbContextOptions选项,ILogger记录器)
:基本(选项){
}
}
子类:
public class Context : AContext<User> {
public Context(DbContextOptions<Context> options, ILogger<Context> logger)
: base(options, logger) { // problem is here with "options"
}
}
公共类上下文:AContext{
公共上下文(DbContextOptions选项,ILogger记录器)
:base(options,logger){//“options”的问题在这里
}
}
错误:无法从“DbContextOptions”转换为“DbContextOptions”
我试过选角,但没用。问题是因为它不是协变的吗?我可以重新设计它吗?一个DbContextOptions
不能分配给DbContextOptions
。原因是可能存在对类型为T
的对象的内部写入操作,而对于DbContextOptions
,该类型的对象将是Context
DbContextOptions
无法提供该选项,因为它的T
是一个AContext
协方差对您来说不是一个答案,因为协方差和逆方差仅适用于接口,而不适用于类
如果将构造函数中的参数类型从
DbContextOptions
更改为DbContextOptions
,则一切正常。这不起作用-尽管可以编译,ASP.NET Core DI容器无法创建上下文的实例。我猜是因为它是抽象的。是的,可能是这样。但这与解决方案无关。让你的课非抽象化。@grokky:这个问题和你的问题不同。如果这两个类都是抽象的,那么在这两种情况下都不起作用。这是另一个问题。