某些EF Core Tools 命令(例如 ,移 轉命令)需要在設計時間建立衍生 DbContext 實例,才能收集應用程式實體類型的詳細數據,以及它們如何對應至資料庫架構。 在大部分情況下,最好 DbContext 是藉由建立的 設定方式,與 運行時間設定的方式類似。
工具嘗試建立 DbContext的方法有很多種:
從應用程式服務
如果您的啟動專案使用 ASP.NET Core Web 主機 或 .NET Core 泛型主機,這些工具會嘗試從應用程式的服務提供者取得 DbContext 物件。
工具會先叫用 、呼叫 Build(),然後存取 Services 屬性,嘗試取得服務提供者Program.CreateHostBuilder()。
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Note
當您建立新的 ASP.NET Core 應用程式時,預設會包含此勾點。
其 DbContext 建構函式中的本身和任何相依性都必須註冊為應用程式服務提供者中的服務。 這可藉由在 上DbContextDbContextOptions<TContext>建立建構函式,將 實例當做自變數並使用 AddDbContext<TContext> 方法,輕鬆達成。
使用不含參數的建構函式
如果無法從應用程式服務提供者取得 DbContext,工具會尋找專案內的衍生 DbContext 類型。 然後,他們會嘗試使用不含參數的建構函式來建立實例。 如果使用 DbContext 方法設定 ,則這可以是預設建 OnConfiguring 構函式。
從設計時間處理站
您也可以藉由實 Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> 作 介面來告訴工具如何建立 DbContext:如果實作此介面的類別位於與衍生 DbContext 專案相同的專案中,或是在應用程式的啟動專案中找到,工具會略過建立 DbContext 的其他方式,並改用設計時間處理站。
public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
public BloggingContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");
return new BloggingContext(optionsBuilder.Options);
}
}
如果您需要DbContext在設計時間設定與運行時間不同的設計時間,如果DbContext建構函式未在 DI 中註冊其他參數,或者如果您完全不使用 DI,或基於某些原因,您不想在 ASP.NET Core 應用程式的 Main 類別中擁有CreateHostBuilder方法,設計時間處理站可能會特別有用。
Args
和都IDesignTimeDbContextFactory<TContext>.CreateDbContextProgram.CreateHostBuilder接受命令行自變數。
您可以從工具指定這些自變數:
dotnet ef database update -- --environment Production
令牌 -- 會指示 dotnet ef 將後續的所有項目視為自變數,而不是嘗試將它們剖析為選項。 未使用 dotnet ef 的任何額外自變數會轉送至應用程式。