c# - EF代码首先更改数据类型bool? bool 和整数?到整数

标签 c# entity-framework ef-code-first entity-framework-migrations

我们有一个使用自动数据迁移的应用程序,不允许丢失数据。 根据公司政策,我不得更改这些设置。

我们在 bool? 的几个表中也有几个可为空的列?类型和整数?类型。

我今天才发现有一段代码遍历现有的数据库记录并将可为空列的值设置为其默认值(分别为 false 和 0)。当前行为会减慢应用程序的速度。我想强制数据库/EF 设置默认值并且不允许空值。

到目前为止,我尝试了以下方法但没有成功:

  1. 从 bool 直接改变类型? bool 和整数?诠释。它抛出数据丢失异常。
  2. 在可为 null 的属性上添加 [Required] 和 [DefaultValue(false)] 属性。同样的事情,数据丢失异常。
  3. 在映射类中将 .IsOptional() 更改为 .IsRequired() 也导致了同样的异常。

我基本上想在 Code First EF 中复制的是以下 MySQL 语句:

ALTER TABLE orders 
CHANGE COLUMN ScaleToFit ScaleToFit TINYINT(1) NOT NULL DEFAULT 0;

对于公司政策方面的问题,是否有任何优雅的解决方案?谢谢!

最佳答案

这可能是我的第一个非编程答案。

我真诚地希望没有优雅的解决方案——而且根本没有解决方案——通过迁移来实现这一点。这将意味着数据丢失检测存在泄漏,这将是个坏消息。它被认为是数据丢失,因为 null 值也可能包含信息,即故意的“不知道”。如果是 bool 值:三态变成二态。在您的情况下情况并非如此,因此进行了此修复过程,但这不会改变规则。

By company's policy, I am not allowed to change those settings.

政策服务于一个目的,但几乎总是变成目的。可能是因为政策比其根本目的更容易定义、执行和检查。但如Goodhart's law ...

When a measure becomes a target, it ceases to be a good measure

...每项政策都可能有一天会违背其目的,不再是一项好政策。认识到这一点并在必要时灵活调整政策的能力是组织的一个值得称赞的特征。

我想说的是:建议​​暂时中止此政策,以允许迁移应用这些具有默认值的不可空字段。 如果 null 值真的毫无意义并且实际上应该从一开始就不是 null,这是到达所需位置的最简单方法。

关于c# - EF代码首先更改数据类型bool? bool 和整数?到整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54933484/

相关文章:

c# - DateTimeFormatInfo.MonthDayPattern 在 Windows Server 2012 中已更改 - 如何将其恢复?

c# - 访问 UserControl 的模板项

c# - 在 Entity Framework 中执行存储过程 - 没有定义键。 (代码第一)

c# - 如何为 SQL Server CE 使用动态连接字符串?

asp.net-mvc-3 - 为什么延迟加载在 razor View (cshtml 文件)中不起作用?

c# - 如何检查 Button.Tag 的首字母?

c# - 如何找到 Windows 7 中 cpu 使用情况的 OID?

c# - Entityframework RC1 - MetadataItem.Annotations made internal - 替代方案?

sql-server-2008 - 强制代码优先始终初始化一个不存在的数据库?

c# - 模拟管理员可以控制网页上某些用户输入字段的只读/查看/默认设置的场景?