EF Core中抽象通用DbContext類的設計

c# entity-framework entity-framework-core generics

我在使用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>>'

我試過鑄造,但這不起作用。問題是由於它不協變嗎?我能以某種方式重新設計嗎?

一般承認的答案

DbContextOptions<Context>不能分配給DbContextOptions<AContext<TUser>> 。原因是可能存在對類型為T對象的內部寫操作,對於DbContextOptions<Context>將是ContextDbContextOptions<AContext<TUser>>無法提供,因為它的TAContext<TUser>

協方差不是您的答案,因為共變和逆變僅適用於接口,而不適用於類。

如果將構造函數中的參數類型從DbContextOptions<Context>更改為DbContextOptions<AContext<User>> ,則一切都可以正常工作。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow