.net - 存储在数据库中的过时枚举成员

标签 .net database entity-framework enums

我在 EF6 的实体中有一个枚举,在保存枚举时它作为一个字节存储在数据库中。

现在我想将 Enum 的一个值标记为 Obsolete,但是仍然会有数据使用这个值。它只是没有在代码中使用。

从技术上讲,我想在代码中删除这个值,但是您会如何处理旧数据?

迁移?

最佳答案

好的做法是遵循以下步骤:

  • 数据迁移:将过时的值替换为正确的值到您的数据库中。
  • 清理代码:删除枚举值,因为不再需要它。

如果因为数据库中还保留着旧值而无法完成数据迁移,那么我将按照以下步骤操作:

  • 从您的枚举中设置字段的每个属性 setter 或方法都必须添加一些防御代码。使用过时的枚举值进行设置时会抛出异常 InvalidOperationException带有明确的消息。
  • 在枚举定义中,我将放置一个带有 <remark> 的 XML 注释这将有助于开发人员了解正在发生的事情。
  • 可选步骤:进一步添加自定义 code analyzer跟踪该值的使用情况。

注意我没有用 [Obsolete] 修饰枚举值属性,因为这个属性意味着两件事:

  • 代码在版本 X 中已过时。
  • 代码将在X之后的版本中删除:版本Y。

这两件事让使用版本 X 的开发人员可以清理他们的实际代码库(删除所有对过时枚举值的使用)并为版本 Y 做好准备(不需要任何更改,因为所有工作都在使用版本 X 时完成).你不能使用 [Obsolete]属性,因为您说过旧数据仍将存在于数据库中,因此您可能需要在某处显示并且您没有遵循我所说的关于 [Obsolete] 的两件事属性。

关于.net - 存储在数据库中的过时枚举成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831715/

相关文章:

.net - 在嵌入式linux中使用mono作为硬件

sql-server - 添加迁移和更新数据库命令未找到 Visual Studio 2015

c# - linq where 包含列表中的所有项目

c# - 是否可以强制仅从已知客户端调用 Web 服务?

sql - 获取绑定(bind)在日历和组合框视频上的列表框

mysql - golang mysql 驱动程序在参数替换时失败

python - python SQLalchemy库的sqlite数据库非ascii字符错误

c# - 如何使用代码优先 CTP5 将列映射到 EF4 中的复杂类型?

c# - 使用 Entity Framework 恢复和备份

C# String.Format() 返回错误字符