Я хочу использовать CockroachDb с Asp.Net Core Identity. Таракан использует проводной протокол Postgres, поэтому пакет Npgsql.EntityFrameworkCore.PostgreSQL также работает с тараканом.
Просто добавить все необходимые сервисы, сгенерировать миграцию и применить ее не получится, потому что сгенерированная миграция использует NpgsqlValueGenerationStrategy.IdentityByDefaultColumn
, что приводит к столбцам с GENERATED BY DEFAULT AS IDENTITY, что не поддерживается тараканом. Поэтому я изменил NpgsqlValueGenerationStrategy
на SerialColumn
во всех сгенерированных файлах миграции (миграция, конструктор, снимок модели). После этого изменения применение миграции работает, но при вызове UserManager.AddClaim
возникает другая ошибка. Исключение переполнения. Итак, я решил, что это связано с тем, что таракан для столбцов SERIAL по умолчанию не использует последовательности, а вместо этого генерирует уникальные числа на основе текущей временной метки и идентификатора узла, что приводит к довольно большим числам. Таракан предоставляет способ перезаписать поведение ключевого слова SERIAL для текущего сеанса, выполнив SET experimental_serial_normalization = sql_sequence
. Поэтому я удалил все таблицы и снова применил миграцию, но перед этим добавил код, выполняющий указанную выше команду, в конструктор AppDbContext. После применения миграции этот код можно удалить, так как он больше не нужен.
Выполнение всех этих действий заставляет Identity работать с CockroachDb, но это очень медленно. Создание нового пользователя занимает ~4 секунды. Добавление нового требования - примерно то же самое. По сравнению с PostgreSQL ~ 1 секунда.
Использование EF Core с тараканом вне Identity происходит медленно, но не безосновательно. Но сочетание EF Core и Cockroach с Identity делает производительность неприемлемой.
В чем может быть проблема? Может быть, изменение всех этих вещей, чтобы заставить Identity работать с тараканом, как-то все испортит? По функционалу все работает нормально.