Предположим, таблица SQL содержит столбец char(10), а запись содержит значение «ABC» в этом столбце. Entity Framework пройдет ABC («ABC» с 7 конечными пробелами) при запросе значения.
Есть ли способ попросить Entity Framework игнорировать конечные пробелы при получении значения столбца типа char, по сути, вместо этого EF обрабатывает его как varchar?
Беглый взгляд на методы, доступные в свободном API, не дал очевидных решений. Удаление entity.Property(e => e.CharColumn).IsFixedLength() не дает желаемого эффекта обрезки конечных пробелов.
Изменение типа столбца с char на varchar в базе данных SQL не является вариантом в моем случае использования, поскольку это может помешать работе других программ, находящихся вне моего контроля, которые читают эту таблицу.
ЭФ прав. Поле char(10) всегда содержит 10 символов. Столбец не содержит ABC, он содержит ABC . Либо удалите IsFixedLength() и используйте поле varchar, либо добавьте явную обрезку в свое приложение.
Почему вы хотите обрезать фактическое значение? Это для демонстрации? Поиск? Сравнение? Это важно. Для поиска и сравнения SQL Server дополняет любое значение длиной менее 10 символов до полной длины в 10 символов, поэтому ABC равно ABC . Никакая обрезка этого не изменит. Если вы хотите обрезать изображение, лучше сделать это в ViewModel или View.
Вы могли бы рассмотреть возможность введения нового столбца varchar, в котором у вас есть логика, контролирующая, следует ли обрезать символы при сохранении в БД.
Расскажите нам, почему вы этого хотите





Вместо использования свойства auto в вашем классе сущности вы можете создать его самостоятельно, обрезав значения.
private string _myProp;
public string MyProp
{
get => _myProp?.TrimEnd();
set => _myProp = value;
}
Будьте осторожны, делая это в установщике. Я не уверен насчет Entity Framework, но EF Core напрямую присваивает значения резервному полю, если оно его находит, минуя установщик. Предполагая, что Entity Framework не обходит установщик:
private string _myProp;
public string MyProp
{
get => _myProp;
set => _myProp = value?.TrimEnd();
}
Это не EF, который обходит установщик. Во всех базах данных поля фиксированной длины дополняются пробелами — или, по крайней мере, так должно быть в соответствии со стандартом SQL. SQL-сервер будет хранить ABC . Во время сравнения строковые значения будут дополняться до длины поля, поэтому ABC равно ABC .
Если ОП захочет обрезать, чтобы можно было искать только ABC, он поймет, что изменений нет.
@PanagiotisKanavos мое решение устраняет проблему во внешнем интерфейсе. SQL-Server игнорирует конечные пробелы при сравнении: fiddle
Я хочу сказать, что мы не знаем реальной проблемы. Если это только для пользовательского интерфейса, это будет работать. Если ОП хочет исключить ABC при поиске ABC, это не произойдет.
Обрезать себя после получения данных? Символ 10 означает, что есть 10 символов, а не 10 или меньше, поэтому я предполагаю, что в нем ничего нет.