如果相应的表有现有数据,我们如何安全地更改 Starcounter
数据库类属性的 datatype
?
例子
现有:int PostalCode
需要:string PostalCode
最佳答案
改变数据库类的属性意味着重构数据库模式,即改变相应列的类型。此类更改不受无缝支持,并且 Starcounter 不提供任何内置工具。可以手动完成,但比较麻烦。
我看到两种方法:
- 使用stardump卸载数据库工具并使用 SQLite 等外部工具修改架构和数据。
- 通过更改应用架构的几个步骤,首先将数据从
int
列移动到string
列,然后将列重命名为原始列。
请记住始终备份您的数据库。
我更详细地描述了第二种方法。
第一步:将数据从 int 移动到 string
- 向数据库类添加
string
类型的新属性,例如PostalCodeString
- 添加并执行应用程序代码,它将遍历该类的所有实例并将
PostalCodeString
设置为从原始int
PostalCode
转换的值 - 停止应用程序并执行 SQL 语句以删除列:
ALTER TABLE TheClassName DROP COLUMN PostalCode
- 从类定义中删除旧属性
PostalCode
并删除转换代码。 - 启动应用程序并测试它是否按预期工作
第二步:重命名列
- 使用旧列名称添加新属性,即
String
类型的PostalCode
- 以与步骤 I 类似的方式将数据从
PostalCodeString
移动到PostalCode
,即通过应用程序代码遍历该类的所有实例。 - 删除列
PostalCodeString
我自己没有测试过这些步骤,但我希望它能奏效。主要关注的是在步骤 II 中创建 PostalCode
。
编辑:删除列 SQL 语句仅在 2017 年 12 月 18 日以来的最新候选版本中得到完全支持。
关于c# - Starcounter - 更改属性的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010547/