EF Core-2-2 HasConversion Char(1)转换为bool

时间:2019-01-15 16:06:44

标签: c# type-conversion entity-framework-core

我正在将旧的SQL Server DB设计转换为EF Core 2.21。 DB设计不可行更改。一个字段是Char(1),其中'X'为true。我添加了一个.HasConversion,但是它不起作用。这些值未转换,并且在进行更改并尝试保存后得到“无法将类型为'System.Boolean'的对象转换为类型为'System.String'的对象”。我指的是https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions,它表示转换可以是从一种类型的值到另一种类型的值。我想念什么?能做到吗?

entity.Property(e => e.LockNote)
    .HasColumnName("LOCK_NOTE")
    .HasMaxLength(1)
    .IsUnicode(false)
    .HasConversion(v => v == "X" ? true : false, v => v == true ? "X" : "");

2 个答案:

答案 0 :(得分:1)

感谢伊万·尤里。你们俩都把我引向一个根本不直观的答案。 LockNote字段是一个Char(1)字段,已作为表类中的字符串属性出现。我需要将其在表类中更改为bool属性,然后使用以下内容:

C:\Users\username>where git
C:\Program Files\Git\cmd\git.exe
C:\Program Files\Git\bin\git.exe

经过进一步的测试,事实证明,我也可以毫无问题地删除以下内容,并进一步简化解决方案。

var boolCharConverter =
    new ValueConverter<bool, string>(v => v ? "X" : "", v => v == "X");

entity.Property(e => e.LockNote)
    .HasColumnName("LOCK_NOTE")
    .IsUnicode(false)
    .HasConversion(typeof(string))
    .HasConversion(boolCharConverter);

答案 1 :(得分:0)

您可以尝试使用built-in BoolToStringConverter

var converter = new BoolToStringConverter("", "X");

entity.Property(e => e.LockNote)
    .HasColumnName("LOCK_NOTE")
    .HasMaxLength(1)
    .IsUnicode(false)
    .HasConversion(converter);