为数据库中新添加的列更新数据,代码优先

Posted

技术标签:

【中文标题】为数据库中新添加的列更新数据,代码优先【英文标题】:Updating data for new added column in database , code first 【发布时间】:2020-01-29 13:54:39 【问题描述】:

我的数据库中有一个现有的用户表,其中包含大约一百万条记录。我的数据库是 MS sql server 2016 。我首先工作代码。现在我将为该表添加一个额外的列,其中将包含一个邀请码。 我需要更新所有现有用户的值,以便为该新列提供唯一的邀请码。 我需要做一些只运行一次的东西(可能在种子方法中),因为这些数据将被更新,并且将来创建的任何新用户在注册时都会有它的邀请码。

所以这将适用于老用户,关于性能和速度的最佳方法是什么,我在该表中有太多记录,是在应用程序启动时运行的种子方法还是什么?

【问题讨论】:

您应该在解决方案中包含数据库的版本号,这样当您更新(添加列)时,您就会知道数据库是否有新列。 invitation code 是否有某种格式或者可以是 0 到 9999999 之间的数字? 是的,邀请码有一个格式,它应该是一个长度为 6 字符的字符串,由数字和数字混合而成,并且对于每个用户来说应该是唯一的 Users 表中有多少条记录? 一百万条记录 【参考方案1】:

我认为脚本 SQL 将是最好的解决方案,你运行它就完成了。

如果您处于早期开发模式,种子方法将是一种解决方案,因此您可以删除记录并重新运行种子方法,但如果您的数据库稳定,我认为脚本会更好。

【讨论】:

【参考方案2】:

1) 使用添加的列创建迁移(您必须将其标记为可为空)

2) 在您所在的位置创建另一个迁移

使用您想要的任何值填充该列。 您可以通过添加自定义 sql 语句来做到这一点

Sql(@"UPDATE YourTableName set YourColumnName = insert logic here")

3) 创建另一个迁移,将列修改为不可为空。

您也许可以在第一次迁移结束或最后一次迁移开始时添加自定义 sql 语句。

【讨论】:

以上是关于为数据库中新添加的列更新数据,代码优先的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先:迁移失败并更新数据库,强制不必要的(?)添加迁移

如何使用添加的列作为查询正确更新数据透视表?

EF 6 数据库优先:如何更新存储过程?

代码优先更新数据库使用未指定的localdb连接字符串

对于数据类型为numeric或nchar的列,以YYYMM等值更新YEAR数据

从 C# 应用程序更新 MS Access 数据库中新添加的记录时,“并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条”