zoukankan      html  css  js  c++  java
  • 【EF Core】使用控制台构建EF进行迁移

    1. 读取配置文件
    2. 构建控制台依赖注入
    3. 通过上下文工厂实现模型迁移
    • 读取配置文件

    在程序包管理控制台安装下面这个包

    Install-Package Microsoft.Extensions.Configuration.Json -Version 2.2.0

    添加文件AppSettings.Json

    同时添加代码,读取路径,生成一个根配置

      var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("AppSettings.json");
    
      var configuration = configurationBuilder.Build();

    这样构建完之后,我们就可以把数据库连接字符串写在这个AppSettings.json 里。

    • 构建控制台依赖注入
    Install-Package Microsoft.Extensions.DependencyInjection -Version 2.2.0

    安装微软用于依赖注入的包,然后实例化一个容器对象,接着就可以在容器中实现依赖注入了。

     ServiceCollection serviceCollection = new ServiceCollection();
    • 通过上下文工厂实现模型迁移

    这里用MSSQL 来做演示。接下来安装EF Core For MSSQL的包,以及工具包

    Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.2.3
    Install-Package Microsoft.EntityFrameworkCore.Tools -Version 2.2.3

    迁移前准备工作

    构建一个模型

        public class AddressBook
        {
            [Key]
            public int Id { get; set; }
            public string Name { get; set; }
            public bool Sex { get; set; }
            public string Telephone { get; set; }
        }

    构建上下文

       public class DemoDbContext: DbContext
        {
            public DemoDbContext(DbContextOptions<DemoDbContext> options) : base(options)
            {
            }
    
            public virtual DbSet<AddressBook> AddressBooks { get; set; }
        }

    注入连接池到容器中

      serviceCollection.AddDbContextPool<DemoDbContext>(options => options.UseSqlServer(configuration.GetConnectionString("AddressBook")));

    将容器构建出来

    var service = serviceCollection.BuildServiceProvider();

    新增一个类,类似于mvc里面的控制器

        public class AddressCurd
        {
            private readonly DemoDbContext _context;
    
            public AddressCurd(DemoDbContext context)
            {
                _context = context;
            }
            public void Run()
            {
    
                _context.Set<AddressBook>().Add(new AddressBook
                {
                    Name="王小明",
                    Sex = true,
                    Telephone = "18012155050"
                });
                _context.SaveChanges();
            }
        }

    通过下面这个方法解析这个类,然后就可以执行这个类里面的方法。

     var instance = ActivatorUtilities.CreateInstance<AddressCurd>(service);
    
     instance.Run();

    。。。等等,是不是还没迁移。就开始写curd了。。。

    emm.那我们先迁移。

    你以为接下来要输入add-migration 了嘛? 不。

    控制台的Main函数对于EF迁移工具来说就是一个黑盒,它根本就不知道你要连接哪个数据库。怎么办呢?之前写的都白写了嘛?

    当然不可能。微软为我们提供了一个IDesignTimeDbContextFactory,给我们提供了一个运行时的上下文

        public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<DemoDbContext>
        {
            public DemoDbContext CreateDbContext(string[] args)
            {
                var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("AppSettings.json");
    
                var configuration = configurationBuilder.Build();
    
                var dbContextOptionsBuilder = new DbContextOptionsBuilder<DemoDbContext>();
    
                dbContextOptionsBuilder.UseSqlServer(configuration.GetConnectionString("AddressBook"));
    
                return new DemoDbContext(dbContextOptionsBuilder.Options);
            }
        }

    接下来执行迁移

     add-migration init
    update-database

     我们的数据库里就有这个表了

    接下来我们运行这个程序,它将会执行Address 下的Run方法 添加一条记录

    OK 使用控制台构建EF进行迁移 不知道你们有没有学会了呢

    项目地址 https://gitee.com/xuxml/EfCoreDemo

     

  • 相关阅读:
    [Tips] uncompyle6进行python的pyc反编译
    [Tips] pip太慢,换源
    [Notes] docker build与docker file
    [Tips] 生成当前python环境的依赖
    [Tips] imagePullPolicy取值
    [Tips] docker镜像和容器导出导入
    js模块化历程
    从一个简单例子来理解js引用类型指针的工作方式
    数组去重的方法总结
    js中const,var,let区别
  • 原文地址:https://www.cnblogs.com/xuxml/p/11069023.html
Copyright © 2011-2022 走看看