在 .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)移除,不能简单的删除文件,否则后续的迁移代码可能会不太对。
输了你,赢了世界又如何...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2016-03-09 SQL SERVER 数据库被标记为“可疑”的解决办法
2016-03-09 SQL SERVER 查看数据库信息
2014-03-09 WPF绑定时要绑定属性,不要绑定字段