設計階段 DbContext 建立
某些 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)
{
}
}
注意
當您建立新的 ASP.NET Core 應用程式時,預設會包含此勾點。
其 DbContext
建構函式中的本身和任何相依性都必須註冊為應用程式服務提供者中的服務。 這可藉由在 上 DbContext
DbContextOptions<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>.CreateDbContext Program.CreateHostBuilder
接受命令列引數。
您可以從工具指定這些引數:
dotnet ef database update -- --environment Production
權杖 --
會指示 dotnet ef
將後續的所有專案視為引數,而不是嘗試將它們剖析為選項。 未使用 dotnet ef
的任何額外引數會轉送至應用程式。