技术解析

.net 的 entity framework 里实体新加字段如何让数据库自动同步
0
2021-06-02 13:48:08
idczone
表里新加字段,实体代码改动后,如何让数据库保持一致。搜到资料是用命令在文件夹里生成迁移脚本,这样脚本岂不是越来越多。这个数据库国外服务器只是在用户客户端用的,这办法太繁琐也容易出错。

在表结构只做增量更新的需求下,有解决办法吗,EnsureCreated 方法只能创建新的数据库和实体一致

如果是 nosql 数据库就不用关心这个问题了,不过调研之后没有发现稳定成熟的嵌入式数据库,仍然用的 sqlite
所有数据库都是这么处理的吧?每次变更生成 Migration 。

好久没用 EF 了……我记得 EF 有三种设计模式:Code-First 、Model-First 、Database-First 。貌似只要不是 Database-First,就可以自动修改数据库表结构的。

官方 Code-First migration 教程: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application
很复杂,目前想到的解决办法:
新建一个单表数据库作为代理,表里三个字段: 实体类名,实体对象 id,实体对象内容(json)。每次程序启动时,从库里读出所有实体对象,用 EnsureCreated 方法生成一个新的数据库进行操作, 程序关闭时将所有实体数据取出存入代理数据库。 结果就是用户数据实际上以 json 形式存在代理数据库,而生成的数据库用来在程序运行期间结构化数据,可以保留 sql 查询的优势。 数据量不大可以考虑。

因为生成的脚本可以和代码一个签入,这样其他人拉取你的代码后,也可以用脚本同步数据库。

生成新的脚本以后,启动客户端之前执行脚本即可。
所有的数据库程序都会有这个问题,要么 DBA 手工执行,要么就是部署程序执行。
新启动的客户端在创建数据库时,可以用合并过的脚本,这样只会有一个脚本创建数据库。

更新表后重新生成实体类,业务实体用 ViewModel

我以前用 Code-First 模式开发,只需写代码就行了。后面场景复杂了就躺平了,修改完数据库手动修改实体

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli

EF 太久没用记不清了。。程序里面应该包括改动后 Add-Migration 生成的 Migrations 类吧,那可以参考:
https://docs.microsoft.com/zh-cn/ef/ef6/modeling/code-first/migrations/EFCore 的话可以直接 dbContext.Database.Migrate()

数据库这种需要稳定的底层结构,当然是每次添加了手动去执行脚本补充字段

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服