設計時 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>>();