Я также хотел исключить значение 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;
}
Код: Выделить всё
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 выдает ошибку времени выполнения, когда 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)
Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-column