如何在模型上使用布尔值来包装数据库中的字符串值?

eer*_*ick 2 c# mysql entity-framework-core

奇怪的问题,可能没有答案...我继承了一个旧的 mysql 数据库,不幸的是许多“布尔”字段被设置为 VARCHAR 而不是更合适的 TINYINT(1)...

我现在在数据库之上运行 Entity Framework Core。由于我不知道在哪里使用布尔值,所以我还不能更新数据库,但我希望能够在 EF 中实际使用字符串值作为布尔值...有没有办法改变模型类型,以便模型将所有内容整齐地包装为 bool,但当我将其推送到数据库时,它仍然将字段视为字符串?

本质上,在我的代码中,我希望能够执行以下操作: object.IsGood = true; 而不是这样:object.IsGood = "TRUE"

我的模型只会谨慎地处理值转换,就像这样写入数据库(并且我需要另一个转换器来从数据库读回布尔值):

string databaseValue = "";
if (object.IsGood)
{
  databaseValue = "TRUE";
}
else
{
  databaseValue = "FALSE";
}
Run Code Online (Sandbox Code Playgroud)

无论如何,我可以看到这样做,当我更改模型时,我实际上会更改数据库......我知道我可以将模型本身包装到另一个类中,但这似乎令人困惑。我很想更新数据库,但这可能会非常痛苦,因为要解开代码接触这些值的所有可能位置......所以我希望有一个中间解决方案。

eer*_*ick 7

我总是在术语“映射”或“包装器”下搜索此类内容,而这些术语并没有从文档中提出任何看起来有用的内容...克里斯托弗的评论让我走上了正轨,我得到了我正在寻找的东西。

显然“价值转换”是我正在寻找的: Value Conversions EF Core

编辑:我已经删除了文档示例,因为任何人都可以查找它。我在下面添加我的真实示例。

由于我想在字符串和布尔值之间来回转换,因此我创建了这个转换器作为静态值,这样我就可以在几个模型中重用它:

public static class EntityFrameworkCoreValueConverters
{
    /// <summary>
    /// converts values stored in the database as VARCHAR to a nullable bool
    /// handles "TRUE", "FALSE", or DBNULL
    /// </summary>
    public static ValueConverter<bool?, string> dbVarCharNullableToBoolNullableConverter = new ValueConverter<bool?, string>(
        v => v == true ? "TRUE" : v == false ? "FALSE" : null,
        v => v.ToUpper() == "TRUE" ? true : false
    );
}
Run Code Online (Sandbox Code Playgroud)

请注意,已经存在 aBoolToStringConverter作为命名空间的一部分Microsoft.EntityFrameworkCore.Storage.ValueConversion,但这似乎无法处理我需要的空值。

然后我可以将模型值更改为bool?string而不是实际的数据库值类型。

然后可以将其dbVarCharNullableToBoolNullableConverter应用于我的OnModelCreating方法中(或者在我的情况下Configure应用于模型本身,该模型本身应用于该OnModelCreating方法中:

public void Configure(EntityTypeBuilder<MachineHelpRequests> builder)
        {
            //... model builder code above

            builder.Property(e => e.IsAcknowledged)
                .HasColumnName("acknowledged_mhr")
                .HasColumnType("varchar(45)")
                .HasConversion(EntityFrameworkCoreValueConverters.dbVarCharNullableToBoolNullableConverter);

            //... model builder code below
}
Run Code Online (Sandbox Code Playgroud)