gpt4 book ai didi

c# - 如何在我的模型上使用 bool 值来包装数据库中的字符串值?

转载 作者:行者123 更新时间:2023-11-29 01:34:41 25 4
gpt4 key购买 nike

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

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

基本上,在我的代码中,我希望能够做到这一点: object.IsGood = true;取而代之的是:object.IsGood = "TRUE"

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

string databaseValue = "";
if (object.IsGood)
{
databaseValue = "TRUE";
}
else
{
databaseValue = "FALSE";
}

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

最佳答案

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

显然“值(value)转化”是我一直在寻找的: Value Conversions EF Core

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

因为我想在字符串和 bool 值之间来回转换,所以我将这个转换器创建为静态值,这样我就可以在几个模型中重用它:

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
}

关于c# - 如何在我的模型上使用 bool 值来包装数据库中的字符串值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com