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