EF Core общается с postgres с типом данных citext

Мне нужна помощь.
Я использую
.NET Core 3.1
Npgsql.EntityFrameworkCore.PostgreSQL 3.1.2
Microsoft.EntityFrameworkCore.Tools 3.1.2
против postgres db
PostgreSQL 11.5

Мы перешли с MSSQL на postgres, и раньше этот код работал:

_context.Users.SingleOrDefaultAsync(x => x.EmailAddress == emailadress);

С учетом сказанного, теперь данные чувствительны к регистру и, например, сравнение "[email protected]" с "[email protected]" перестало работать. Можно было бы заменить все на более низкие строки, но, поскольку существует много подобных сравнений, потребуется некоторое время, чтобы это изменить.
Тогда я нашел цитекст, который мне на помощь, я подумал.
Я изменил таблица / столбец, а затем - объект .net. Я немного не уверен, как исправить.

Я попытался добавить к объекту на основе этой ссылки: https://www.npgsql.org/efcore/mapping/general.html?tabs=data-annotations

[Column(TypeName = "citext")]
public string EmailAddress { get; set; }

но это не помогло. Я нахожу это в журналах:
Выполнение DbCommand [Parameters = [@__ emailadress_0 = '?'], CommandType = 'Text', CommandTimeout = '30 ']
И я не знаю, следует ли мне ожидать CommandType = 'citext' здесь или нет.

Есть ли у кого-нибудь какие-либо комментарии по этому поводу?
Большое спасибо!


person Johan    schedule 30.04.2020    source источник
comment
Является ли разница в написании между john.doe и Jo h an.Doe преднамеренной?   -  person Flydog57    schedule 30.04.2020
comment
Извините, автозаполнение .. Это, конечно, должно быть то же имя, но заглавными и строчными буквами.   -  person Johan    schedule 03.05.2020
comment
Я считаю, что с SQL Server поведение регулируется правилами сопоставления для базы данных / таблицы / столбца. Я никогда не использовал postgres   -  person Flydog57    schedule 04.05.2020
comment
@Johan Я только что провел быстрый минимальный тест, и все вышеперечисленное работает правильно ... Я бы еще раз проверил, действительно ли тип столбца был применен к вашей базе данных. В противном случае попробуйте создать минимально работоспособную программу, и, если вы можете перепрограммировать ее там, опубликуйте это.   -  person Shay Rojansky    schedule 04.05.2020
comment
@ShayRojansky: Спасибо за информацию и проверку. Я создал минимально работоспособную программу, и она действительно сработала. В журналах я все еще видел CommandType = 'Text', и я думаю, что тогда я не увижу CommandType = 'citext' в этом месте. Я все же нашел проблему. Наши данные / таблицы существовали в схеме, отличной от общедоступной, и у пользователя, который использовался для подключения, не была установлена ​​схема по умолчанию / предпочтительная схема. После того, как эта схема была установлена, она заработала. Странно, но это решило мою проблему. Спасибо, в любом случае!   -  person Johan    schedule 05.05.2020
comment
Приятно слышать, что это сработало! Обратите внимание, что CommandType не имеет ничего общего с типом параметра (text / citext). CommandType Text просто означает, что command содержит обычный оператор SQL (в отличие от StoredProcedure).   -  person Shay Rojansky    schedule 05.05.2020


Ответы (2)


Убедитесь, что к вашей базе данных применена новая миграция с этим изменением типа.

Еще одна вещь, которую следует учитывать, - это сопоставление, используемое вашей базой данных. Я думаю, что сразу после того, как вы перешли с MSSQL на Postgre, сопоставление не было сохранено.

person Tony Troeff    schedule 03.05.2020
comment
Привет, @Tony! Спасибо за ответ. Ну, я сам отредактировал таблицу в базе данных, изменив тип столбца на citext из текста. В модели .net / entity я добавил префикс в столбец, как вы можете видеть. Все равно не работает .. - person Johan; 04.05.2020

У пользователя, который использовался для подключения к базе данных Postgres, не была задана схема по умолчанию. Используемые данные / таблицы не существуют в схеме по умолчанию, установленной для базы данных. После того, как предпочтительная / стандартная схема была установлена ​​для пользователя, используемого для подключения к базе данных, сравнение citext начало работать.

    ALTER ROLE myUser IN DATABASE myDatabase SET search_path TO mySchema;
person Johan    schedule 05.05.2020