我正在将旧的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" : "");
答案 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);