天天看點

Entity Framework Core(3)-配置DbContext

設計時 DbContext 配置

EF Core 設計時工具如

遷移

需要能夠發現和建立的工作執行個體

DbContext

以收集有關應用程式的實體類型以及它們如何映射到資料庫架構的詳細資訊的類型。 此過程可以為自動,隻要該工具可以輕松地建立

DbContext

,會将其配置同樣到它如何将配置在運作時的方式。

盡管提供了必要的配置資訊到任何模式

DbContext

可在運作時,需要使用的工具

DbContext

在設計時僅适用于有限數量的模式。 這些内容中更詳細地介紹

設計時上下文建立

部分。

配置 DbContextOptions

DbContext

 必須具有的執行個體

DbContextOptions

才能執行任何工作。 

DbContextOptions

執行個體執行的配置資訊如:

  • 資料庫提供程式,若要使用,通常選擇通過調用的方法,如

    UseSqlServer

    UseSqlite

    。 這些擴充方法需要相應的提供程式包,如

    Microsoft.EntityFrameworkCore.SqlServer

    Microsoft.EntityFrameworkCore.Sqlite

    。 中定義的方法

    Microsoft.EntityFrameworkCore

    命名空間。
  • 任何必要的連接配接字元串或辨別符的資料庫執行個體中,通常作為參數傳遞到上述提供程式選擇方法
  • 任何提供程式級别的可選行為選擇器,通常還連結到提供程式選擇方法調用中
  • 任何正常 EF Core 行為選擇器,通常連結之後或之前提供程式選擇器方法

下面的示例将配置

DbContextOptions

若要使用 SQL Server 提供程式,在連接配接包含

connectionString

變量、 提供程式級别的指令逾時,以及可使在中執行的所有查詢 EF Core 行為選擇器

DbContext

否跟蹤

預設情況下:

optionsBuilder
    .UseSqlServer(connectionString, providerOptions=>providerOptions.CommandTimeout(60))
    .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);      

備注

提供程式選擇器方法和上面提到的其他行為選擇器方法是擴充方法上

DbContextOptions

或特定于提供程式的選項類。 若要有權通路這些擴充方法,可能需要具有一個命名空間 (通常

Microsoft.EntityFrameworkCore

) 中的作用域以及在項目中包含其他包依賴項。

DbContextOptions

可以提供給

DbContext

通過重寫

OnConfiguring

方法或構造函數參數通過從外部。

如果将使用它們,

OnConfiguring

最後應用,并且可以覆寫選項提供給構造函數參數。

構造函數參數

使用構造函數的上下文代碼:

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}      

 提示

DbContext 基構造函數還接受非泛型版本的

DbContextOptions

,但不是建議使用多個上下文類型的應用程式使用的非泛型版本。

從構造函數自變量進行初始化的應用程式代碼:

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");

using (var context = new BloggingContext(optionsBuilder.Options))
{
  // do stuff
}      

OnConfiguring

上下文代碼

OnConfiguring

:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=blog.db");
    }
}      

應用程式代碼來初始化

DbContext

,它使用

OnConfiguring

using (var context = new BloggingContext())
{
  // do stuff
}      

此方法不會将自身添加到測試,除非測試以完整的資料庫為目标。

使用依賴關系注入使用 DbContext

EF Core 支援使用

DbContext

與依賴關系注入容器。 DbContext 類型可以通過使用添加到服務容器

AddDbContext<TContext>

方法。

AddDbContext<TContext>

 将這兩個 DbContext 類型, 

TContext

,并相應

DbContextOptions<TContext>

可用于從服務容器的注入。

請參閱

多個讀取

以下依賴關系注入的其他資訊。

添加

Dbcontext

依賴關系注入到:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
}      

這要求将添加

到 DbContext 類型接受

DbContextOptions<TContext>

上下文代碼:

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
      :base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}      

(在 ASP.NET Core) 的應用程式代碼:

public class MyController
{
    private readonly BloggingContext _context;

    public MyController(BloggingContext context)
    {
      _context = context;
    }

    ...
}      

(服務提供商處直接使用,不太常見) 的應用程式代碼:

using (var context = serviceProvider.GetService<BloggingContext>())
{
  // do stuff
}

var options = serviceProvider.GetService<DbContextOptions<BloggingContext>>();      

LouieGuo