.net 处理实体框架5中的枚举更改

.net 处理实体框架5中的枚举更改,.net,entity-framework,enums,migration,entity-framework-5,.net,Entity Framework,Enums,Migration,Entity Framework 5,在中,我发现实体框架迁移无法处理枚举更改。事实上,枚举更改甚至不会导致模型更改错误,因此您可以随意更改枚举,而无需任何控件 导致不同int值的枚举更改(如顺序更改或删除)可以有效地使数据库数据无效,因为存储的整数的含义现在是错误的 为了使迁移能够工作,您必须手动执行更改枚举值的自定义SQL 问题是,开发人员必须记住这一点,如果存在疏忽,那么可能会发生有效的数据损坏 有人怎么能对此进行检查?如果枚举发生更改,是否可能抛出模型更改错误或类似的错误?当您将枚举移出另一个项目用作库时,.Net中也存在类

在中,我发现实体框架迁移无法处理枚举更改。事实上,枚举更改甚至不会导致模型更改错误,因此您可以随意更改枚举,而无需任何控件

导致不同int值的枚举更改(如顺序更改或删除)可以有效地使数据库数据无效,因为存储的整数的含义现在是错误的

为了使迁移能够工作,您必须手动执行更改枚举值的自定义SQL

问题是,开发人员必须记住这一点,如果存在疏忽,那么可能会发生有效的数据损坏


有人怎么能对此进行检查?如果枚举发生更改,是否可能抛出模型更改错误或类似的错误?

当您将枚举移出另一个项目用作库时,.Net中也存在类似的枚举问题:

试试看——枚举一般都非常脆弱。答案是始终为枚举指定一个显式值,以防止这两个问题。这允许您仍然利用它们的核心价值(使用清晰的名称而不是神奇的数字,以及在方法参数中键入安全性),但可以防止您悄悄地破坏一切


您可以通过正则表达式通过代码检查或提交后挂钩来强制执行此策略。

重命名时也会遇到同样的问题:如果有人忘记处理特殊列,则会删除旧列并创建新列。如果存在停机问题,则自动迁移不适合生产使用。因为新枚举不需要更改模型,所以不会引发模型更改错误。EF无法知道数据库中的枚举值“1”与具有该值的“Car”不同,但由于重命名为“truck”,枚举通常被视为常量,不应更改。ContextKey是一个完全限定的类型名,还有一个模型,它是迁移历史表中的某种二进制blob。该blob应该包含枚举定义并检测此类更改。显然不是。这看起来像是一个糟糕的EF设计。