C# EF代码首次更改数据类型bool?去布尔和int?整型

C# EF代码首次更改数据类型bool?去布尔和int?整型,c#,entity-framework,ef-code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework Migrations,我们有一个使用自动数据迁移的应用程序,不允许数据丢失。根据公司的政策,我不允许更改这些设置 在bool?的几个表中,我们也有一些可为空的列?类型和int?类型 我今天刚刚发现,有一段代码遍历了现有的数据库记录,并将可空列的值设置为其默认值(分别为false和0)。当前行为会减慢应用程序的速度。我想强制数据库/EF设置默认值,不允许空值 到目前为止,我尝试了以下方法,但没有成功: 从bool直接更改类型?去布尔和int?到int。它抛出数据丢失异常 在可空属性上添加[Required]和[Defa

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

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

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

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

  • 从bool直接更改类型?去布尔和int?到int。它抛出数据丢失异常
  • 在可空属性上添加[Required]和[DefaultValue(false)]属性。同样的事情,数据丢失例外
  • 在mapping类中将.IsOptional()更改为.IsRequired(),也会导致相同的异常
  • 我主要想在CodeFirst EF中复制以下MySQL语句:

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

    在公司政策方面,是否有任何优雅的解决方案?谢谢大家!

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

    我最真诚地希望没有优雅的解决方案,也没有任何解决方案可以通过迁移实现这一点。这将意味着数据丢失检测中存在漏洞,这将是个坏消息。这被视为数据丢失,因为
    null
    值也可能包含信息,即故意的“不知道”。对于布尔型:三态转换为两态。这在您的情况下是不正确的,因此这个修复过程,但这不会改变规则

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

    政策是有目的的,但几乎总是会变成目的。可能是因为政策比其根本目的更容易定义、实施和检查。但正如在

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

    ……每一项政策总有一天会失去其目的,不再是一项好政策。认识到这一点并在必要时灵活运用政策的能力是组织值得称赞的特征


    我想说的是:建议暂时一次性暂停此策略,以允许只应用这些具有默认值的不可为空字段的迁移。如果空值真的没有意义,并且实际上从一开始就不应该为空,那么这是达到目的的最简单方法。

    您是否只尝试了
    DefaultValue
    属性(没有
    Required
    属性)?@Matt.G刚刚尝试过。单独设置
    DefaultValue
    不会对已经存在的空值产生任何影响。我想,这只会影响未来的记录。我不确定你是否可以对数据库中的现有数据做些什么。当您尝试在带有DefaultValue属性的代码中获取此数据时会发生什么情况?它是否返回false或null?@Matt.G它返回nullI还提供了在代码中正确处理null的功能,而不是期望不可为null的值。但这需要比自定义迁移更多的更改。