EF代码首先更改数据类型bool?布尔和整数?诠释

时间:2019-02-28 20:08:36

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

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

我们在一些布尔表中也有一些可为空的列?类型和整数?类型。

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

到目前为止,我没有运气尝试过以下方法:

  1. 直接从bool更改类型?布尔和整数?诠释。它将引发数据丢失异常。
  2. 在可为空的属性上添加[Required]和[DefaultValue(false)]属性。同样,数据丢失异常。
  3. 在映射类中将.IsOptional()更改为.IsRequired()也会导致相同的异常。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

我最真诚地希望没有完美的解决方案,也根本没有解决方案,无法通过迁移来实现这一目标。这意味着数据丢失检测存在泄漏,这将是一个坏消息。之所以认为数据丢失是因为(?=TEXT_AFTER)值也可能包含信息,即故意的“不知道”。在布尔值的情况下:三态变为二态。对于您而言,这是不正确的,因此是固定过程,但这并不会改变规则。

  

根据公司政策,不允许更改这些设置。

政策达到一个目的,但几乎总是变成这个目的。可能是因为策略比其基本目的更易于定义,实施和检查。但是就像Goodhart's law ...

  

当一项措施成为目标时,它就不再是一项好措施

...每项政策都有一天可能无法实现其目的,而不再是一项好的政策。认识到这一点并在必要时灵活运用策略的能力是组织值得称赞的功能。

我要说的是:建议​​暂时暂停此策略,以允许仅 应用默认值的这些不可为空的字段进行迁移。 如果 null值实际上毫无意义,实际上从一开始就应该不是null,这是到达所需位置的最简单方法。