[文章內容來源於Microsoft Doc ]
某些EF Core 工具命令(如遷移)需要在設計時創建一個派生DbContext
實例,以便收集有關該應用程序的實體類型及其如何映射到數據庫架構的詳細信息。
設計時 DbContext 配置
配置 DbContextOptions
DbContext
必須具有 DbContextOptions
的實例才能執行工作。
DbContextOptions實例包含如下配置:
- 數據庫提供程序 ,通常通過調用方法(UseSqlServer或者UseSqlite)進行選擇。
- 必須的數據庫實例連接字符串或標識符,通常通過參數傳遞到上面的提供者選擇方法。
- 提供程序級別的可選行為選擇器。
- EF Core 行為選擇器
配置示例如下:
optionsBuilder .UseSqlServer(connectionString, providerOptions=>providerOptions.CommandTimeout(60)) .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
配置DbContextOptions根據DbContext的構造函數有沒有參數分兩種類型:構造函數傳參設置,重寫OnConfiguring方法設置。
-
構造函數參數
有參構造函數,利用參數將DbContextOptions傳遞到DbContext

1 public class BloggingContext : DbContext 2 { 3 public BloggingContext(DbContextOptions<BloggingContext> options) 4 : base(options) 5 { } 6 7 public DbSet<Blog> Blogs { get; set; } 8 }
-
OnConfiguring
無參構造函數,重寫OnConfiguring方法。

1 public class BloggingContext : DbContext 2 { 3 public DbSet<Blog> Blogs { get; set; } 4 5 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 6 { 7 optionsBuilder.UseSqlite("Data Source=blog.db"); 8 } 9 }
設計時 DbContext 創建
遷移工具有多種方式創建設計時DbContext:
- 從應用程序服務創建。
- 使用不帶參數的構造函數創建。
- 從設計時工廠創建。
-
從應用程序服務創建
如果啟動項目使用ASP.NET Core Web 主機或.Net Core 泛型主機,則這些工具將嘗試從應用程序的服務提供程序獲取 DbContext 對象。
工具首先嘗試通過調用Program.CreateHostBuilder()
、調用Build()
,然后訪問Services
屬性來獲取服務提供程序。DbContext
及其構造函數中的任何依賴項都需要在應用程序的服務提供程序中注冊為服務。

1 public class Program 2 { 3 public static void Main(string[] args) 4 => CreateHostBuilder(args).Build().Run(); 5 6 // EF Core uses this method at design time to access the DbContext 7 public static IHostBuilder CreateHostBuilder(string[] args) 8 => Host.CreateDefaultBuilder(args) 9 .ConfigureWebHostDefaults( 10 webBuilder => webBuilder.UseStartup<Startup>()); 11 } 12 13 public class Startup 14 { 15 public void ConfigureServices(IServiceCollection services) 16 => services.AddDbContext<ApplicationDbContext>(); 17 } 18 19 public class ApplicationDbContext : DbContext 20 { 21 public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 22 : base(options) 23 { 24 } 25 }
-
使用不帶參數的構造函數創建
如果無法從應用程序服務提供程序獲得 DbContext,則工具將查找項目中的DbContext
派生類型。 然后,它們嘗試使用不帶參數的構造函數創建實例。該方式需要DbContext重寫OnConfiguring方法,在該方法中配置DbContextOptions。
-
從設計時工廠創建
通過實現IDesignTimeDbContextFactory<TContext>
接口來告訴工具如何創建 DbContext:如果在與派生DbContext
的項目相同的項目中或在應用程序的啟動項目中找到了實現此接口的類,則這些工具將繞過創建 DbContext 的其他方法並改用設計時工廠。如果需要以不同於運行時的方式配置 DbContext 的設計時, DbContext
則設計時工廠特別有用。

1 using Microsoft.EntityFrameworkCore; 2 using Microsoft.EntityFrameworkCore.Design; 3 using Microsoft.EntityFrameworkCore.Infrastructure; 4 5 namespace MyProject 6 { 7 public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext> 8 { 9 public BloggingContext CreateDbContext(string[] args) 10 { 11 var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 12 optionsBuilder.UseSqlite("Data Source=blog.db"); 13 14 return new BloggingContext(optionsBuilder.Options); 15 } 16 } 17 }