EF Core-2-2 HasConversion Char (1) для bool - PullRequest
0 голосов
/ 15 января 2019

Я конвертирую старый дизайн БД SQL Server в EF Core 2.21. Дизайн БД не практичен для изменения. Одно поле - это 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 голосов
/ 16 января 2019

Спасибо как Ивану, так и Юрию.Вы оба привели меня к ответу, который был совсем не интуитивным для меня.Поле LockNote - это поле Char (1), которое появилось как строковое свойство в классе таблицы.Мне нужно было изменить это значение в классе таблицы на свойство bool, а затем я использовал следующее:

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);

. При дальнейшем тестировании выясняется, что я также могу удалить следующее без проблем и еще больше упростить решение.

    .IsUnicode(false)
    .HasConversion(typeof(string))
0 голосов
/ 15 января 2019

Вы можете попробовать использовать встроенный BoolToStringConverter :

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

entity.Property(e => e.LockNote)
    .HasColumnName("LOCK_NOTE")
    .HasMaxLength(1)
    .IsUnicode(false)
    .HasConversion(converter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...