V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
longkas239
V2EX  ›  程序员

.net 的 entity framework 里实体新加字段如何让数据库自动同步

  •  
  •   longkas239 · 2021-05-16 13:30:53 +08:00 via Android · 1758 次点击
    这是一个创建于 1298 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表里新加字段,实体代码改动后,如何让数据库保持一致。搜到资料是用命令在文件夹里生成迁移脚本,这样脚本岂不是越来越多。这个数据库只是在用户客户端用的,这办法太繁琐也容易出错。

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

    如果是 nosql 数据库就不用关心这个问题了,不过调研之后没有发现稳定成熟的嵌入式数据库,仍然用的 sqlite
    10 条回复    2021-05-17 22:24:31 +08:00
    Mithril
        1
    Mithril  
       2021-05-16 14:50:49 +08:00
    所有数据库都是这么处理的吧?每次变更生成 Migration 。
    xuanbg
        2
    xuanbg  
       2021-05-16 14:59:34 +08:00
    好久没用 EF 了……我记得 EF 有三种设计模式:Code-First 、Model-First 、Database-First 。貌似只要不是 Database-First,就可以自动修改数据库表结构的。
    longkas239
        3
    longkas239  
    OP
       2021-05-16 16:45:47 +08:00
    官方 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 查询的优势。 数据量不大可以考虑。
    alinwu05
        4
    alinwu05  
       2021-05-16 16:58:41 +08:00
    因为生成的脚本可以和代码一个签入,这样其他人拉取你的代码后,也可以用脚本同步数据库。
    forgottencoast
        5
    forgottencoast  
       2021-05-16 17:07:48 +08:00
    生成新的脚本以后,启动客户端之前执行脚本即可。
    所有的数据库程序都会有这个问题,要么 DBA 手工执行,要么就是部署程序执行。
    新启动的客户端在创建数据库时,可以用合并过的脚本,这样只会有一个脚本创建数据库。
    netnr
        6
    netnr  
       2021-05-17 08:47:56 +08:00 via Android
    更新表后重新生成实体类,业务实体用 ViewModel
    flytsuki
        7
    flytsuki  
       2021-05-17 09:49:33 +08:00
    我以前用 Code-First 模式开发,只需写代码就行了。后面场景复杂了就躺平了,修改完数据库手动修改实体
    he1a2s0
        9
    he1a2s0  
       2021-05-17 15:02:32 +08:00
    EF 太久没用记不清了。。程序里面应该包括改动后 Add-Migration 生成的 Migrations 类吧,那可以参考:
    https://docs.microsoft.com/zh-cn/ef/ef6/modeling/code-first/migrations/#automatically-upgrading-on-application-startup-migratedatabasetolatestversion-initializer

    如果是 EFCore 的话可以直接 dbContext.Database.Migrate()
    ggabc
        10
    ggabc  
       2021-05-17 22:24:31 +08:00
    数据库这种需要稳定的底层结构,当然是每次添加了手动去执行脚本补充字段
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.