【问题标题】:EF Core power tools generate nullable BooleanEF Core 电动工具生成可为空的布尔值
【发布时间】:2020-02-26 17:09:38
【问题描述】:

我正在使用EF Core Power Tools 版本2.4.0Miccrosoft.EntifyFrameworkCore.SqlServer 版本2.2.6

我将 SQL 表列 IsActive 定义为 [IsActive] [bit] NOT NULL
我使用 EF Core Power Tool 的逆向工程来生成实体和数据库上下文。

问题
该工具生成可为空的布尔属性,而不仅仅是布尔

public bool? IsActive { get; set; }

对应DBContext的OnModelCreating方法

modelBuilder.Entity<Scenario>(entity =>
            {
                entity.Property(e => e.ScenarioID).HasColumnName("ScenarioID");

                entity.Property(e => e.IsActive)
                    .IsRequired()
                    .HasDefaultValueSql("((1))");

}

【问题讨论】:

    标签: ef-core-2.2 ef-core-2.1 ef-power-tools


    【解决方案1】:

    EF Core 使用 CLR 默认值来确定是否使用 SQL 默认值。

    可以为空:

    • null ➡ 1(通过 DEFAULT)
    • 假➡ 0
    • 真➡ 1

    不可以为空:

    • false ➡ 1(通过 DEFAULT)
    • 真➡ 1

    如果不可以为空,就无法插入0

    另一种选择是只删除 HasDefaultValueSql 并使用不可为空的:

    • 假➡ 0
    • 真➡ 1

    【讨论】:

    • 不懂Without nullable, there would be no way to insert a 0!你可以在not null列中插入0
    • 正确,您可以在 EF Core 之外。但是,在 EF Core 中,非 nullalbe 布尔值有两个值——false 和 true——并且 EF Core 使用 CLR 默认值 (false) 来指示您要使用 SQL 默认值 (1)。没有办法告诉 EF 插入 0。
    • 请注意,它被标记为IsRequired——您实际上不能将 NULL 值保存到数据库中。这只是意味着如果您保存一个新实体而不设置值,则将使用 SQL 默认值 (1)。
    • @bricelam 我想知道一件事.. 为什么不将X BIT NOT NULL DEFAULT 1 的列映射为public bool X { get; set; } = true; 然后您可以通过将其设置为 false 来保存 0,但默认情况下它是 inited确实如此,所以 C# 模仿 SQL 行为? (为什么我们需要一种方式对 EF 说“我想在这里使用 DB 默认值”与将 DB 默认值复制到 C#?好的,它不允许 DBA 在不重新编译 C# 的情况下更改它们,但这似乎是自找麻烦无论如何.. 也可以通过 nullabools 以外的其他方式允许(isSet=false bool that trues on set{} or do bool?-&gt;bool in get{}
    • @CaiusJard 大智若愚。见#15070 (comment)
    【解决方案2】:

    您可以在最新版本的 EF Core Power Tools 中禁用此行为,因此默认会被忽略

    【讨论】:

    • 像魅力一样工作
    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2015-11-18
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多