简体   繁体   English

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

[英]Design of abstract generic DbContext class in EF Core

I'm having trouble implementing an abstract generic base class, using EF Core. 我在使用EF Core实现抽象通用基类时遇到麻烦。 It's probably something obvious, but I'm not seeing it. 这可能很明显,但我没有看到。

base class: 基类:

public abstract class AContext<TUser> : IdentityDbContext<TUser> 
  where TUser : IdentityUser {

    public AContext(DbContextOptions<AContext<TUser>> options, ILogger<AContext<TUser>> logger) 
      : base(options) {
    }

}

subclass: 子类:

public class Context : AContext<User> {

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

}

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

I tried casting but that doesn't work. 我尝试了投射,但这不起作用。 Is the problem due to it not being covariant? 是因为它不是协变的问题吗? Can I redesign it somehow? 我可以重新设计吗?

A DbContextOptions<Context> is not assignable to DbContextOptions<AContext<TUser>> . DbContextOptions<Context>无法分配给DbContextOptions<AContext<TUser>> The reason is that there could be internal write operations to objects of type T , which for DbContextOptions<Context> would be Context . 原因是可能对类型T对象进行内部写操作,对于DbContextOptions<Context> ,这将是Context DbContextOptions<AContext<TUser>> can not provide that, because it's T is an AContext<TUser> . DbContextOptions<AContext<TUser>>无法提供它,因为它是TAContext<TUser>

Covariance is not an answer for you, since co- and contravariance is only available for interfaces, not for classes. 协方差不是您的答案,因为协方差和逆方差仅适用于接口,不适用于类。

If you change the parameter type in your constructor from DbContextOptions<Context> to DbContextOptions<AContext<User>> , everything should work fine. 如果将构造函数中的参数类型从DbContextOptions<Context>更改为DbContextOptions<AContext<User>> ,则一切正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM