【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

 

 

 

转载于:https://www.cnblogs.com/xuxml/p/11069023.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值