EF Core 强大工具生成可为 null 的布尔值

LP1*_*P13 9 ef-power-tools ef-core-2.1 ef-core-2.2

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

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

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

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))");

}
Run Code Online (Sandbox Code Playgroud)

bri*_*lam 6

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

\n\n

可以为空:

\n\n
    \n
  • null \xe2\x9e\xa1 1 (通过默认值)
  • \n
  • 假\xe2\x9e\xa1 0
  • \n
  • 真 \xe2\x9e\xa1 1
  • \n
\n\n

不可以为空:

\n\n
    \n
  • false \xe2\x9e\xa1 1(通过默认值)
  • \n
  • 真 \xe2\x9e\xa1 1
  • \n
\n\n

如果没有可为空,就无法插入0!

\n\n

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

\n\n
    \n
  • 假\xe2\x9e\xa1 0
  • \n
  • 真 \xe2\x9e\xa1 1
  • \n
\n

  • 不明白“如果不能为空,就无法插入 0!”您可以在非空列中插入“0” (2认同)
  • 正确,您可以在 EF Core 之外。然而,在 EF Core 内部,非 nullalbe bool 有两个值 - false 和 true - 并且 EF Core 使用 CLR 默认值 (false) 来指示您要使用 SQL 默认值 (1)。无法告诉 EF 插入 0。 (2认同)
  • @bricelam我想知道一件事......为什么不将“X BIT NOT NULL DEFAULT 1”列映射为“public bool X { get; ” 放; } = true;` 那么你可以通过将其设置为 false 来保存 0,但默认情况下它会被初始化为 true,因此 C# 会模仿 SQL 行为?(为什么我们需要一种方法来对 EF 说“我想在这里使用 DB 默认值”而不是将 DB 默认值复制到 C#?好吧,它不允许 DBA 在不重新编译 C# 的情况下更改它们,但这似乎是自找麻烦无论如何..也可以允许除 nullabools 之外的其他方式(`isSet=false` bool 表示 `set{}` 上的 `true` 或在 `get{}` 中执行 `bool?-&gt;bool`) (2认同)
  • @CaiusJard 英雄所见略同。请参阅 [#15070(评论)](https://github.com/dotnet/efcore/issues/15070#issuecomment-477220843) (2认同)