EF Code First更改数据类型bool? bool和int?到int

问题描述 投票:1回答:1

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

我们在几个bool表中也有一些可以为空的列? type和int?类型。

我今天刚刚发现,有一段代码覆盖了现有的数据库记录,并将可空列的值设置为默认值(分别为false和0)。当前行为会降低应用程序的速度。我想强制数据库/ EF设置默认值,不允许空值。

到目前为止,我尝试了下面没有运气:

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

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

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

针对公司政策的问题,有没有优雅的解决方案?谢谢!

c# entity-framework ef-code-first ef-migrations
1个回答
3
投票

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

我最衷心地希望通过迁移实现这一目标,没有优雅的解决方案 - 根本没有解决方案。这意味着数据丢失检测存在漏洞,这将是个坏消息。它被认为是数据丢失,因为null值也可能带有信息,即故意“不知道”。在布尔值的情况下:三态变为双态。在您的情况下不是这样,因此这个修复过程,但这不会改变规则。

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

政策有目的,但几乎总是变成目的。可能是因为策略比其基本目的更容易定义,执行和检查。但就像在Goodhart's law ...

当一项措施成为目标时,它就不再是一个好的衡量标准

......每一项政策可能有一天会破坏其目的而不再是一项好政策。能够识别这一点并在必要时对政策进行灵活处理是组织的一个值得称赞的特征。

我想说的是:建议​​暂时一次性暂停此策略,以允许迁移只应用具有默认值的这些非可空字段。如果空值真的没有意义,实际上从一开始就不应该是null,这是获取所需位置的最简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.