[英]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.