Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# efcore中抽象泛型DbContext类的设计_C#_Entity Framework_Generics_Entity Framework Core - Fatal编程技术网

C# efcore中抽象泛型DbContext类的设计

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

我在使用EF Core实现抽象泛型基类时遇到问题。这可能是显而易见的,但我没有看到

基类:

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:这个问题和你的问题不同。如果这两个类都是抽象的,那么在这两种情况下都不起作用。这是另一个问题。