1. 程式人生 > >Entity Framework Core(3)-配置DbContext

Entity Framework Core(3)-配置DbContext

設計時 DbContext 配置

EF Core 設計時工具如遷移需要能夠發現和建立的工作例項DbContext以收集有關應用程式的實體型別以及它們如何對映到資料庫架構的詳細資訊的型別。 此過程可以為自動,只要該工具可以輕鬆地建立DbContext,會將其配置同樣到它如何將配置在執行時的方式。

儘管提供了必要的配置資訊到任何模式DbContext可在執行時,需要使用的工具DbContext在設計時僅適用於有限數量的模式。 這些內容中更詳細地介紹設計時上下文建立部分。

配置 DbContextOptions

DbContext 必須具有的例項DbContextOptions

才能執行任何工作。 DbContextOptions例項執行的配置資訊如:

  • 資料庫提供程式,若要使用,通常選擇通過呼叫的方法,如UseSqlServerUseSqlite。 這些擴充套件方法需要相應的提供程式包,如Microsoft.EntityFrameworkCore.SqlServerMicrosoft.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>>();