【发布时间】:2018-01-18 19:02:02
【问题描述】:
我正在寻找一种适当的方法来扩展现有数据库,基于实体框架 6 代码优先实现,并为表中每个现有行的新字段添加唯一值。
到目前为止,我已经创建了一个添加新字段的迁移。
Up 方法如下所示:
Public Overrides Sub Up()
AddColumn("dbo.Customers", "UniqueCode", Function(c) c.String(unicode:=False))
End Sub
我被困在应该用唯一(计算)值填充新字段的地方。为简单起见,假设数据库中的每个现有行都应在迁移时分配一个 GUID。
使用这样的 SQL 语句会更新具有相同 GUID 的所有行。但我需要它对每一行都是唯一的。
Sql("Update dbo.Customers SET UniqueCode = '" & Guid.NewGuid().ToString)
在 Up 方法中使用 foreach 似乎有点错误……在这种情况下,最佳实践是什么?
另外:我使用的数据库是access,所以不能使用newid()或者random()。 GUID 旨在成为以编程方式计算的值的虚拟对象。它将是客户其他一些属性的哈希值。所以它必须通过迁移来计算和更新。
【问题讨论】:
-
新值可以在服务器端计算,还是需要应用程序代码来计算?如果可以在服务器端进行,您可以编写脚本并调用存储过程来计算和更新字段添加后
Up期间的数据。 -
不确定我是否完全理解您的问题。新值是根据数据库客户记录中的一组现有值计算得出的,然后使用 SHA256 算法对其进行哈希处理。无需用户输入。
-
我在问您是否可以完全在 stored proc 内计算和更新新字段,或者您是否真的需要根据不在数据库中的数据或使用不在数据库中的数据以编程方式计算它由数据库服务器支持。如果您可以在 proc 中执行此操作,则添加 proc 并在添加列的行之后的
Up中调用它。 -
感谢您的澄清。我不能在 proc 中进行,因为计算是基于数据库服务器不支持的方法。
-
基于您正在处理的限制,我认为循环数据并逐行更新将是您唯一的选择。
标签: asp.net vb.net entity-framework ms-access jet-ef-provider