.net 的 entity framework 里实体新加字段如何让数据库自动同步 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
longkas239
V2EX    程序员

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

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

    在表结构只做增量更新的需求下,有解决办法吗,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/span>
    更新表后重新生成实体类,业务实体用 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     Solana     2707 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:15 PVG 23:15 LAX 08:15 JFK 11:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86