彩钢做网站能赚钱吗,学新媒体运营最好的培训学校,《高性能网站建设指南》,龙岩到永定使用EF Core的Code First#xff0c;在设计阶段#xff0c;直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据#xff0c;删除的风险非常低。但是对于已经投入生产的数据库#xff0c;这个方法就绝对不可行了。
考虑…
使用EF Core的Code First在设计阶段直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据删除的风险非常低。但是对于已经投入生产的数据库这个方法就绝对不可行了。
考虑以下场景
项目已经上线一直使用本地测试数据库进行开发本地已经增加和修改了较多数据库表结构线上数据庞大且实时更新现在测试完毕需要进行上线。
如果需要更新生产数据库我能想的有两种方法
从一开始就使用Migration
从数据库开始设计的时候就使用EF Migration保证数据库能够与代码同步不过操作的时候需要极为小心务必要检查生成的更新数据库代码直接连接生产数据库
需要注意的事项
从一开始就使用Migration任何时候都不要使用Context.Database.EnsureCreated或者EnsureDeleted语句。使用Add-migration之后不要删除生成的Migration文件这些文件记录了数据结构的变化历史。并不是所有的变化都能自动识别比如“修改表列名称大小写”这种情况很多时候生成的数据是执行删除然后再新建和我们重命名的初衷相去甚远。因此要特别检查migrationBuilder.Drop相关的页面。
使用Scaffold
如果一开始就没有使用migration进行同步的话那么使用EF Core将无法直接更新我们需要变通一下
逆向数据库到模型
首先需要数据库的数据结构逆向到模型我们使用Scaffold就可以了详细文档就可以查看这里需要注意的是我们的场景下已经有修改好的DataContext与Model在进行scaffold的过程中一定要指定outputdir和context不要和当前的文件冲突。 根据自己的喜好选择是否采用-DataAnnotations另外也可以使用-table指定需要修改的表没有被指定的表将保持原样。默认EF Core会按照自己的命名规则重新命名如果你想保留自己的套路那么使用-UseDatabaseNames参数。 Add-Migration
输出的模型我指定放在Models文件夹原来的Models文件夹我改成了Models1并且更换了命名空间以保证项目现在能够正常编译。
导出的模型与DbConextModels.Models命名空间Models文件夹新模型与DbConextModels命名空间Models1文件夹 接下来运行Add-Migration。
add-migration initialcreate -context exportedContext这样会在Migrations文件夹下面生成一个snapshot和一个migration文件。snapshot是当前数据库的跟踪另外一个是运用update-database时系统会执行的操作。里面有一个Up()和一个Down()方法Up是执行更新时EF对数据库的操作Down是回滚当前更改。由于这是第一次执行add-migrationEF Core会认为数据库现在还是空的因此两个方法都有大量的语句我们删除所有create和drop相关的语句我这边是全部删除了只留下空方法。
应用迁移同步
前面准备工作已经到位了这一步将直接操作数据库了。使用update-database将当前的migration更新到数据库由于我们现在的数据结构和生产数据库的数据结构一模一样实际上我们不需要执行什么操作删除了Up、Down内部的代码执行Update-Database只是让EF Core将Models和生产数据库建立联系。 我理解只是添加__EFMigrationsHistory中的记录以便EF Core后续追踪。 修改模型内容
将Models1中的文件覆盖Models中的文件由于类型命名的差异可能会提示一些错误按照自己的习惯修改就好了。接下来是循序渐进一点点修改模型并经常add-migration观察生成的语句是否正常。
由于我使用了Identity在数据中有对应的AspNet开头的表这些表我并不在本系统中使用其他系统需要用因此我删除了对应的模型、snapshot、DbContext记录运行Add-Migration生成了如下文件 protected override void Up(MigrationBuilder migrationBuilder){migrationBuilder.DropTable(name: AspNetRoleClaim);migrationBuilder.DropTable(name: AspNetUserClaim);migrationBuilder.DropTable(name: AspNetUserLogin);migrationBuilder.DropTable(name: AspNetUserRoles);migrationBuilder.DropTable(name: AspNetUserToken);migrationBuilder.DropTable(name: AspNetRole);migrationBuilder.DropTable(name: AspNetUser);}说明现在已经能够正常跟踪我们的修改了不过我这里需要保留对应的表因此删除up与down的所有内容。
注意以下几点
更新模型名称
如果使用fluentAPI那么模型对应的表名称会直接在fluentAPI中直接指定只修改模型的名称没有任何效果。修改的话可以修改对应的fluentAPI或者换用Annotation
提示找不到constraint
对于修改主键、索引等内容的情况如果不是通过EF Core建立的数据库那么命名规则可能不一样。对于postgresql数据库可以用这个查询名称然后修改对应的migration文件内容即可。
SELECT * FROM pg_CONSTRAINT复合主键的限制
对于使用两列或者以上列作为复合主键的情况使用EnsureCreated方法是可以识别Annotation形式的主键的。
[Key]
[Column(Order 1)]
public string DeviceId { get; set; }
[Key]
[Column(Order 2)]
public long Timestamp { get; set; }使用Migration的时候这种形式无法识别需要在OnModelCreating()中使用fluentAPI
modelBuilder.EntityDeviceData().HasKey(w new { w.DeviceId, w.Timestamp });Command执行超时
默认Command执行的超时设置只有30s对一些大一点的表来说是不太够的。可以设置
optionsBuilder.UseNpgsql(Serverxxxxxxxxxxxxx, optopt.CommandTimeout(3000));增加命令执行的超时时间。
多个连接字符串的情况
如果程序使用了appsettings.Development.json之类的文件存储连接字符串那么需要指定环境是Production生产数据库否则可能还原到本地数据库去了。 对于nuget包管理控制台使用update-database)执行
$Env:ASPNETCORE_ENVIRONMENT Development
Update-Database对于使用dotnet ef工具集的直接执行
dotnet ef database update --environment Developmentcannot be cast automatically to type
设计数据库表如果修改列的数据类型比如从varchar到integerPostgresql会提示这个问题导致无法修改。可以在migrationbuilder中使用sql按照提示添加USING x::integer解决。但是这种方法还是不太优雅手动处理Up()之后还需要处理Down()否则将无法正确还原。
可以使用分步的方法进行假设我们需要将Id从varchar改成int4。
添加一个字段temp类型为int4设置为[Key]然后删除Id字段。添加并应用迁移修改temp名称为Id添加并应用迁移
多次应用迁移
每次修改尽量少一点然后update-database这样更容易发现问题对于有 这种提示的一定要检查生成语句中Drop相关的语句。 本地数据库与生产数据库都有__EFMigrationsHistory记录相关的迁移情况。在生产与本地数据库中进行切换时不用担心顺序问题Update-Database会一个个应用迁移直到最新。 总结
使用Migration能够降低数据库同步中很多工作量合理利用可以对生产用的数据库进行热更新。 注本文在.NET 6EF Core 6下测试通过。 相关内容拓展技术前沿
近10年间甚至连传统企业都开始大面积数字化时我们发现开发内部工具的过程中大量的页面、场景、组件等在不断重复这种重复造轮子的工作浪费工程师的大量时间。
针对这类问题低代码把某些重复出现的场景、流程具象化成一个个组件、api、数据库接口避免了重复造轮子。极大的提高了程序员的生产效率。
推荐一款程序员都应该知道的软件JNPF快速开发平台。这是一个基于Java Boot/.Net Core构建的简单、跨平台快速开发框架。前后端封装了上千个常用类方便扩展集成了代码生成器支持前后端业务代码生成实现快速开发提升工作效率框架集成了表单、报表、图表、大屏等各种常用的Demo方便直接使用后端框架支持Vue2、Vue3。
体验官网https://www.jnpfsoft.com/?csdn
还没有了解低代码这项技术可以赶紧体验学习