繁体   English   中英

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

[英]How do I use a boolean on my model that wraps a string value from the database?

奇怪的问题,可能没有答案...我继承了一个旧的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";
}

我能看到的任何方式,实际上都是在更改模型时更改数据库...我知道我可以将模型本身包装到另一个类中,但这似乎令人困惑。 我只想更新数据库,但是要弄清代码可能接触这些值的所有可能的地方可能会非常痛苦……所以我希望有一个中间解决方案。

我总是用“映射”或“包装器”这个词来搜索这类东西,而这些东西并没有从看起来有用的文档中提出任何东西……克里斯托弗的评论使我走上了正确的道路,我得到了我所寻找的东西。

显然,我正在寻找“ 价值转换 ”: 价值转换EF核心

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

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

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

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

然后可以将模型值更改为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
}

这可能不是最好的解决方案,但是在您可以重构数据库之前,它可能会帮助您。

在模型中添加部分类,并实现适当的getter和setter。

partial class Model
{
    [NotMapped]
    public bool FieldABool
    {
        get
        {
            return FieldA == "TRUE";
        }
        set
        {
            if (value == true)
            {
                    FieldA = "TRUE";
            }         
            else
            {
                FieldA = "FALSE";
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM