首页 > 其他分享 >记EFCore迁移在分层项目中的问题

记EFCore迁移在分层项目中的问题

时间:2023-05-10 17:23:31浏览次数:46  
标签:builder MyDbContext 数据库 connectionString 分层 EFCore 迁移 public

首先在单个项目中使用EFCore是很简单的,看看微软官网的文档几乎不会出现迁移的问题

但是我的习惯是把与表相关的实体类和创建的迁移文件全部单独放在一个程序集中,这样便于集中管理,而且还可以把数据层共享给多个应用层,减少重复写代码

我的应用层的程序集是WpfApp,是一个WPF程序,数据层的程序集是WpfApp.Reponsitory,是一个类库。如下图

 

我的环境:

.NET6

EFCore 7.0.5

 

WpfApp.Reponsitor 项目

1,首先安装Nuget包,我用的是sqlite,所以安装Microsoft.EntityFrameworkCore.Sqlite,如果用MySQL就安装Pomelo.EntityFrameworkCore.MySql

2,编写实体类

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

3,编写实体类配置类,我这里仅仅配置了表的名称

    public class StudentEntityConfig : IEntityTypeConfiguration<Student>
    {
        public void Configure(EntityTypeBuilder<Student> builder)
        {
            builder.ToTable("t_student");
        }
    }

4,编写数据库上下文类,下面的两个重写方法可以不重写,自定义的有参构造函数用来接收应用层的配置

    public class MyDbContext : DbContext
    {
        public DbSet<Student> Students { get; set; }

        public MyDbContext(DbContextOptions options) : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }

 

 

WpfApp项目

1,项目引用 WpfApp.Reponsitor 

2,安装Nuget包,Microsoft.EntityFrameworkCore.Design

3,编写上下文创建工厂类,因为EF执行手动迁移的时候(执行命令:Update-Database),要先通过默认的DbContextFactory构造一个数据库上下文对象,也就是MyDbContext对象,然而上面代码中可以看出,我们没有在MyDbContext中配置数据库的连接字符串等配置,

所以迁移是执行不成功的,因为它都不知道要将表创建在哪里,因此我们自己定义一个MyDbContextFactory,重写CreateDbContext返回我们自己创建的上下文对象。否则的话即使我们可以成功构建迁移文件,但是不能直接迁移到数据库中(手动迁移

    public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
    {
        public MyDbContext CreateDbContext(string[] args)
        {
            string connectionString = ConfigurationManager.AppSettings["sqliteConnDev"];

            var builder = new DbContextOptionsBuilder<MyDbContext>()
                    .UseSqlite(connectionString);

            return new MyDbContext(builder.Options);
        }
    }

 

使用代码自动迁移

很多时候我们希望应用程序启动后,自动检查数据库是否存在,不存在的话自动创建,表是否存在,不存在的话也自动创建。下面就来演示一下代码自动迁移

1,定义一个迁移方法

        public static async Task Migration(string connectionString)
        {
            var builder = new DbContextOptionsBuilder<MyDbContext>()
               .UseSqlite(connectionString);

            using MyDbContext dbContext = new MyDbContext(builder.Options);

            //执行迁移
            //如果数据库存在并且包含任何表,则不执行任何操作。 不执行任何操作来确保数据库架构与实体框架模型兼容。
            //如果数据库存在但没有任何表,则使用实体框架模型创建数据库架构。
            //如果数据库不存在,则创建数据库并使用实体框架模型创建数据库架构。
            await dbContext.Database.EnsureCreatedAsync();
        }

2,项目启动的时候调用上面的迁移方法,有了这一步你甚至不需要先构建迁移文件就可以直接执行迁移

    public partial class App : Application
    {
        private string connectionString = ConfigurationManager.AppSettings["sqliteConnPro"];

        protected override async void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            await AutoMigrationHelper.Migration(connectionString);
        }
    }

 

以上代码已经上传GitHub仓库:jinleil/EFCoreTest: EFCore迁移在分层项目中的应用测试 (github.com)

标签:builder,MyDbContext,数据库,connectionString,分层,EFCore,迁移,public
From: https://www.cnblogs.com/zfsn2021/p/17388561.html

相关文章

  • dotnet ef命令行执行迁移步骤
    如果你的sln由两个项目构成,一个是webapi,一个是dataaccess,例如项目结构如下My_Solution|DataAccess_Project|--DbContext.cs|WebApp_Project|--Startup.cs按照一下步骤执行。(关键点:需要指定启动项目)CDMy_Solutiondotnetefmigrations......
  • 人大金仓数据库迁移工具web版访问方式
    1.新版使用谷歌浏览器进行访问访问地址: http://localhost:54523/默认用户名及密码:kingbase/kingbase2. 老版使用谷歌浏览器进行访问访问地址:http://localhost:8080/默认用户名及密码:admin/123456&*会话保存策略:会话保存时间为一天,服务重启或登出失......
  • Dockerfile、常用和不常用命令、dockerfile构建一个djagno项目、docker私有仓库、镜像
    目录1Dockerfile1.1常用和不常用命令1.2dockerfile构建一个djagno项目2docker私有仓库2.1镜像传到官方仓库2.2镜像分层2.3私有仓库搭建3dockercompose介绍4dockercompose部署flask+redis项目4.1新建flask项目app.py4.2编写Dockerfile--》用于构建flask项目的镜像4.3......
  • Hbase跨集群迁移以及常用命令
    场景:由于Hbase版本升级以及集群切换,现需要将Hbase从A集群(源)迁移至B集群(目的)迁移过程:将源A集群的Hbase需要迁移的表(注意namespace)通过snapshot方式打成快照,然后再通过ExportSnapshot方式迁移至目的B集群,此时目的集群的HDFS目录下的hbase目录会生成.hbase_snapshot和archive目录......
  • LDAP备份迁移和LDAP主从配置,阿里云服务器做主,内网机做从,zabbix,gilab,jumpserver接入lda
    一,LDAP备份迁移1,原服务器上导出备份文件mkdir/opt/ldap/usr/sbin/slapcat>/opt/ldap/ldapdbak.ldif2,目标服务器搭建ldap环境yuminstallopenldapopenldap-clientsopenldap-serversserviceslapdstartsystemctlenableslapdslappasswd-h{SSHA}-sxxxxx #生成管理......
  • abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之下(六十四)
    abp(netcore)+easyui+efcore实现仓储管理系统目录abp(netcore)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)abp(netcore)+easyui+efcore实现仓储管理系统——解决方案介绍(二)abp(netcore)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(netcore)+eas......
  • 数据库迁移之从oracle 到 MySQL
    关键字:数据库迁移之从oracle到MySQL开场白:对于水平扩展需求很强烈的大型网站,oracle到mysql的迁徙是必然的,一个重要的因素就是Oracle数据库是收费的,而MySQL则是完全免费的,mysql经过在大型网站的考验及沉淀目前已经修复的很完美了,下面就oracle到mysql......
  • Oracle到国产数据库DM的迁移案例
    Oracle到国产数据库DM的迁移案例 阿依纳伐 发表于2020/12/2510:37:49  3.5k+  0  0 【摘要】对于达梦数据库,我在19年之前还没有听过,第一次听到达梦,金仓数据的时候还是我们打算开始做鲲鹏专家服务的技术研讨会上,数据库专家在说国产数据库的提到达梦和金仓,感觉完......
  • 历时1年,大型金融企业100%核心系统国产数据库迁移实践
    历时1年,大型金融企业100%核心系统国产数据库迁移实践 2022-08-0309:40作者介绍刘伟光,阿里巴巴集团副总裁、阿里云智能新金融&互联网事业部总经理。一、前言在国家层面提出加快建设科技强国,实现高水平科技自立自强的大背景之下,某超大型保险(集团)公司深入推进数字化转型,紧随......
  • python 创建虚拟环境以及数据迁移和.Django创建app
    一.python创建虚拟环境1.1首先要确认在那个位置创建虚拟环境创建命令virtualenv虚拟环境名称二.python数据迁移1.生成迁移文件pythonmanage.pymakemigrations2.同步到数据库中pythonmanage.pymigrate三.Django创建apppythonmanage.pystartappAPP名称......