設計時 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