我可以安全地在ASP.NET Core和EF Core中使用非泛型DbContextOptions嗎?

asp.net-core asp.net-identity c# entity-framework-core

在ASP.NET Core中,EF Core上下文由內置DI容器創建。在官方文檔中 ,使用泛型DbContextOptions<TContext>創建上下文:

public class MyContext : IdentityDbContext<User> {
  public MyContext(DbContextOptions<MyContext> options, ILogger<MyContext) logger) : base(options) { }
}

但是,也有非泛型的例子:

public class MyContext : IdentityDbContext<User> {
  public MyContext(DbContextOptions options, ILogger<MyContext) logger) : base(options) { }
}

根據源代碼,它們之間的區別是:

類型參數:TContext:這些選項適用的上下文的類型。

我想使用非泛型類型,因為在我的設計中我有一個抽象的上下文,並且與DI容器不兼容。

那麼,如果我使用非泛型類型,這究竟意味著什麼?我的上下文將無法正確配置?

一般承認的答案

我想使用非泛型類型,因為在我的設計中我有一個抽象的上下文,並且與DI容器不兼容。

使用DI容器就可以了。它只查看派生最多的類型,它試圖實例化的類型。事實上,介於兩者之間的基類是不相關的。

請注意,雖然您不能使用DbContextOptions<AbstractDbContext> ,但您不需要。您可以使基類採用DbContextOptions ,或使基類通用並採用DbContextOptions<ConcreteDbContext>

abstract class AbstractDbContext : DbContext
{
    protected AbstractDbContext(DbContextOptions options) : base(options)
    {
    }
}

class ConcreteDbContext : AbstractDbContext
{
    public ConcreteDbContext(DbContextOptions<ConcreteDbContext> options) : base(options)
    {
    }
}

要么

abstract class AbstractDbContext<TContext> : DbContext
    where TContext : AbstractDbContext<TContext>
{
    protected AbstractDbContext(DbContextOptions<TContext> options) : base(options)
    {
    }
}

class ConcreteDbContext : AbstractDbContext<ConcreteDbContext>
{
    public ConcreteDbContext(DbContextOptions<ConcreteDbContext> options) : base(options)
    {
    }
}

那麼,如果我使用非泛型類型,這究竟意味著什麼?我的上下文將無法正確配置?

採用非泛型DbContextOptions構造函數通常也可以。通常,你是對的,服務提供商將無法弄清楚這一點。然而,EF核心專門通知服務容器,當你調用serviceCollection.AddDbContext<ConcreteDbContext>(...)當一個DbContextOptions請求例如, DbContextOptions<ConcreteDbContext>應提供實例。

請注意,這僅在您具有單個上下文類型時才有效。如果您有多個,則服務提供商沒有足夠的信息來確定您需要哪個。


熱門答案

以下是IdentityDbContext基類(通用和非通用) 構造函數的簽名:

public IdentityDbContext(DbContextOptions options)

對我來說意味著它可以使用非泛型DbContextOptions而沒有問題。

實際上, DbContextOptions類的泛型非泛型版本之間的唯一區別是泛型版本實現了abstract非泛型版本。

仍然,將DbContextOptions<YourDbContext>傳遞給YourDbContext構造函數更安全,因為它確保調用者將傳遞抽像類的正確實現(基本上是ContextType屬性)。



Related

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