• 在 .net core 3.1 中,使用控制台 console 程序对 ef 实体并建立迁移


    因为 console 程序非常干净,所以从配置文件的读取到数据库配置都需要自己完成

    1、读取配置文件:

    注:(1)需要自己在项目目录中建立 appsettings.json 文件,或其它类型配置文件也可以,这里灵活处理;

    (2)建立后记得将文件的生成选项设置为如果较新则复制到输出目录,便于修改更新。

    /// <summary>
    /// 初始化应用程序配置文件
    /// </summary>
    /// <returns></returns>
    public static IConfigurationRoot InitConfiguration()
    {
        var basePath = Directory.GetCurrentDirectory();
        var configBuilder = new ConfigurationBuilder()
            .SetBasePath(basePath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables();
        var configuration = configBuilder.Build();
    
        Console.WriteLine("配置文件:");
        Console.WriteLine(Path.Combine(basePath, "appsettings.json"));
    
        return configuration;
    }

    转自:https://www.cnblogs.com/xiaoyu369/p/9559237.html

    2、配置数据库:

    注:(1)可以根据需求配置不同的数据库使用程序;

    (2)使用 options.MigrationAssembly 是因为实体数据集没用和当前控制台程序在一个程序集中,需要指定迁移代码执行的程序集。

    /// <summary>
    /// 初始化数据库配置
    /// </summary>
    /// <param name="configuration">应用程序配置</param>
    /// <returns></returns>
    public static DbContextOptions<PsyDbContext> InitDatabase(IConfigurationRoot configuration)
    {
        var connectionString = configuration.GetConnectionString("PSYDB");
        var optionsBuilder = new DbContextOptionsBuilder<PsyDbContext>();
        var dbType = configuration.GetValue<int>("DbType");
        switch (dbType)
        {
            case 1:
                optionsBuilder.UseSqlServer(connectionString, options => options.MigrationsAssembly("EfCoreMigrationTest"));
                break;
            case 2:
                optionsBuilder.UseMySql(connectionString);
                break;
            default:
                optionsBuilder.UseSqlite(connectionString);
                break;
        }
        var dbContextOptions = optionsBuilder.Options;
    
        Console.WriteLine($"数据库[dbType:{dbType}]:");
        Console.WriteLine(connectionString);
    
        return dbContextOptions;
    }

    转自:https://www.cnblogs.com/skyfreedom/archive/2019/07/10/11166399.html

    3、测试调用:

    class Program
    {
        /// <summary>
        /// 应用程序配置对象
        /// </summary>
        public static IConfigurationRoot Configuration { get; private set; }
    
        /// <summary>
        /// 数据库配置对象
        /// </summary>
        public static DbContextOptions<PsyDbContext> DbContextOptions { get; private set; }
    
        /// <summary>
        /// 获取实体上下文
        /// </summary>
        public static PsyDbContext DbContext => new PsyDbContext(DbContextOptions);
    
        static async Task Main(string[] args)
        {
            // 初始化
            Configuration = InitConfiguration();
            DbContextOptions = InitDatabase(Configuration);
    
            // 具体使用代码
            var userlist = await DbContext.UserInfo.Take(5).ToArrayAsync();
    
            // 输出结果
            Console.WriteLine("检查数据:");
            Console.WriteLine(JsonConvert.SerializeObject(userlist, Formatting.Indented));
            Console.ReadKey();
        }
    }

    4、配置文件(appsettings.json)内容:

    {
      "ConnectionStrings": {
        "PSYDB": "Data Source=.;Initial Catalog=PSYDB;User ID=sa;Password=123456;Connect Timeout=15"
      },
      // 数据库类型:0-sqlite,1-sqlserver,2:mysql
      "DbType": 1
    }

    5、实体上下文:定义就不在这里列出了,可参考第2步的文章链接,或其它 EF Core 文章。

    6、使用 Fluent Api 来配置实体类:

    原来的父类改为了接口:IEntityTypeConfiguration<>

    继续按原来 EF 的配置方法使用即可,记得在实体里重写 OnModelCreating 方法中配置:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
            .Where(t => t.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);
    
        foreach (var type in typesToRegister)
        {
            dynamic configurationInstance = Activator.CreateInstance(type);
            modelBuilder.ApplyConfiguration(configurationInstance);
        }
    }

    转自:https://www.cnblogs.com/Zhang-Xiang/p/7580899.html

    7、实体工厂类:

    注:如果需要生成迁移代码,以上代码还不够,还需要添加一个实体工厂类,便于设计工具在运行时可以通过此类实例化实体类型

    /// <summary>
    /// 实体工厂类,便于 EF 设计时工具创建实体上下文(可在程序包控制台中执行迁移初始化:Add-Migration InitialCreate)
    /// </summary>
    public class PsyDbContextFactory : IDesignTimeDbContextFactory<PsyDbContext>
    {
        public PsyDbContext CreateDbContext(string[] args)
        {
            var configuration = Program.InitConfiguration();
            var options = Program.InitDatabase(configuration);
            return new PsyDbContext(options);
        }
    }

    转自:https://stackoverflow.com/questions/56686093/unable-to-create-an-object-of-type-dbcontext

    参考:https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/

    https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dbcontext-creation

    8、结束:

    到此就完成了代码的编写,可以在 Visual Studio 的程序包控制台中,执行:Add-Migration InitialCreate 建立迁移了;

    另外如果不想要迁移代码了的话,一定要使用命令行(Remove-Migration)移除,不能简单的删除文件,否则后续的迁移代码可能会不太对。

  • 相关阅读:
    Goahead在linux环境下安装部署
    vim卡住怎么办
    Clickhouse 实现 row number功能
    JavaScript ES6 模块化
    MySQL012事务的四个基本特征是什么
    MySQL015简述mysql中索引类型有哪些,以及对数据库的性能的影响
    MySQL010MySQL执行计划怎么看
    JavaScript ES6 Promise
    MySQL011如何处理MySQL的慢查询
    MySQL009MySQL为什么需要主从复制和读写分离
  • 原文地址:https://www.cnblogs.com/xwgli/p/12446575.html
Copyright © 2020-2023  润新知