• [EF Core]设计时DbContext


    [文章内容来源于Microsoft Doc ]

      某些EF Core 工具命令(如迁移)需要在设计时创建一个派生DbContext实例,以便收集有关该应用程序的实体类型及其如何映射到数据库架构的详细信息。 

    设计时 DbContext 配置

    配置 DbContextOptions

      DbContext 必须具有 DbContextOptions 的实例才能执行工作。

      DbContextOptions实例包含如下配置:

    1. 数据库提供程序 ,通常通过调用方法(UseSqlServer或者UseSqlite)进行选择。
    2. 必须的数据库实例连接字符串或标识符,通常通过参数传递到上面的提供者选择方法。
    3. 提供程序级别的可选行为选择器。
    4. 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 }
    View Code
    • 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 }
    View Code

    设计时 DbContext 创建

      迁移工具有多种方式创建设计时DbContext:

    1. 从应用程序服务创建。
    2. 使用不带参数的构造函数创建。
    3. 从设计时工厂创建。
    • 从应用程序服务创建

      如果启动项目使用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 }
    View Code
    • 使用不带参数的构造函数创建

       如果无法从应用程序服务提供程序获得 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 }
    View Code
  • 相关阅读:
    Java接口的实现理解
    RDP |SSH |VNC简介
    关于彻底理解cookie,session,token的摘录,生动形象
    7.Reverse Integer&#160;&#160;
    1.Two Sum
    图形化编程娱乐于教,Kittenblock实例,播放与录制声音
    图形化编程娱乐于教,Kittenblock实例,一只思考的变色猫
    内存条性能参数查询(任务8)
    任务8选配内存,重点解读兼容与接口的搭配技术,解读选配内存的过程
    图形化编程娱乐于教,Kittenblock实例,键盘操控角色
  • 原文地址:https://www.cnblogs.com/amytal/p/11685909.html
Copyright © 2020-2023  润新知