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)
无论如何,我可以看到这样做,当我更改模型时,我实际上会更改数据库......我知道我可以将模型本身包装到另一个类中,但这似乎令人困惑。我很想更新数据库,但这可能会非常痛苦,因为要解开代码接触这些值的所有可能位置......所以我希望有一个中间解决方案。
我总是在术语“映射”或“包装器”下搜索此类内容,而这些术语并没有从文档中提出任何看起来有用的内容...克里斯托弗的评论让我走上了正轨,我得到了我正在寻找的东西。
显然“价值转换”是我正在寻找的: 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)
| 归档时间: |
|
| 查看次数: |
1657 次 |
| 最近记录: |