Строка EF Core ValueConverter в bool для строкового столбца с нулевым значением ⇐ C#

Место общения программистов C#
Anonymous
Строка EF Core ValueConverter в bool для строкового столбца с нулевым значением

Сообщение Anonymous »

Мне нужны отзывы, которые помогут понять, возможно ли то, чего я пытаюсь достичь. У меня есть столбец базы данных, который представляет собой тип строки, допускающий значение NULL (в основном varchar), и я использую ValueConverter для преобразования значения строки db в значение bool сущности в зависимости от того, имеет ли значение db значение null, 'N' (false) или 'Y ' (правда).
Я также хотел исключить значение nullable bool? введите свойство сущности, используя EntityConfiguration. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я делаю свойство сущности ненулевым логическим значением вместо bool? миграция завершается неудачей, говоря, что тип должен иметь значение NULL.
Сначала у меня есть этот ValueConverter для преобразования моих строковых значений в логические значения, не допускающие значения NULL.

Код: Выделить всё

internal class NullableStringToBoolValueConverter : ValueConverter
{
public NullableStringToBoolValueConverter() : base(ToDbValue, ToEntityValue) { }

private static HashSet YesTypes = new(StringComparer.OrdinalIgnoreCase) { "1", "Y", "Yes" };
private static HashSet NoTypes = new(StringComparer.OrdinalIgnoreCase) { "0", "N", "No" };

private static Expression ToEntityValue
=> value => value != null && YesTypes.Contains(value) ? true : false;

private static Expression ToDbValue
=> value => value == false ? "N" : "Y";

/// 
/// Allow nulls to pass into converter for conversion.
/// 
public override bool ConvertsNulls => true;
}
Тогда у меня есть объект, использующий свойство bool, не допускающее значения NULL.

Код: Выделить всё

public class EntityName
{
public bool IsActive { get; set; }
}
Наконец, у меня есть следующая конфигурация для этого свойства.

Код: Выделить всё

public class EntityNameConfiguration : ...omitted
{
builder.Property(e => e.IsActive)
.HasConversion()
.HasMaxLength(10)
.IsUnicode(false)
.IsRequired(false)
}
Я ожидал, что EF будет знать, что строка, допускающая значение NULL, будет преобразована ValueConverter в логическое значение, не допускающее NULL, но вместо этого я получаю сообщение об ошибке, в котором говорится, что мне нужно сделать свойство IsActive обнуляемым. .
Возможно ли то, что я хочу здесь сделать?
ОБНОВЛЕНИЕ: Я не упомянул то, что опубликованный здесь код не запустится. EF выдает ошибку времени выполнения, когда IsRequired(false) используется со свойством сущности, не допускающим значения NULL.
Теперь я создал локальную базу данных, созданную с использованием свойства, не допускающего значения NULL, которое из Конечно, создается столбец, не допускающий значения NULL. Затем я меняю столбец на обнуляемый, просто для проверки, и оставляю материал EF как не обнуляемый. Это дает мне новую ошибку, которая выглядит так, будто EF внутренне ожидает столбец базы данных, не допускающий значения NULL, и вместо этого находит пустой столбец.

Код: Выделить всё

System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values.
at Microsoft.Data.SqlClient.SqlDataReader.GetString(Int32 i)
at lambda_method165(Closure, QueryContext, DbDataReader, ResultContext, SingleQueryResultCoordinator)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
Я начинаю думать, что использование свойства сущности, отличного от NULL, со столбцом, допускающим значение NULL, невозможно. Я думал (надеялся), что ValueConverter позволит этому работать.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-column

Вернуться в «C#»