EF Core中抽象通用DbContext类的设计

时间:2017-01-05 11:22:22

标签: 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<TUser>> logger) 
      : base(options) {
    }

}

子类:

public class Context : AContext<User> {

    public Context(DbContextOptions<Context> options, ILogger<Context> logger)
      : base(options, logger) {   // problem is here with "options"
    }

}

错误:Cannot convert from 'DbContextOptions<Context>' to 'DbContextOptions<AContext<User>>'

我尝试过投射,但这不起作用。问题是由于它不协变吗?我能以某种方式重新设计吗?

1 个答案:

答案 0 :(得分:3)

DbContextOptions<Context>无法分配给DbContextOptions<AContext<TUser>>。原因是对于T类型的对象可能存在内部写入操作,DbContextOptions<Context>将为ContextDbContextOptions<AContext<TUser>>无法提供,因为它TAContext<TUser>

协方差不是你的答案,因为共同和逆变只适用于接口,而不适用于类。

如果您将构造函数中的参数类型从DbContextOptions<Context>更改为DbContextOptions<AContext<User>>,那么一切都应该可以正常工作。