【发布时间】:2020-07-21 00:37:50
【问题描述】:
我想将 CockroachDb 与 Asp.Net Core Identity 一起使用。 Cockroach 使用 Postgres 的有线协议,因此 Npgsql.EntityFrameworkCore.PostgreSQL 包也适用于 Cockroach。
简单地添加所有必要的服务、生成迁移并应用它是行不通的,因为生成的迁移使用NpgsqlValueGenerationStrategy.IdentityByDefaultColumn,这导致列带有 GENERATED BY DEFAULT AS IDENTITY,Cockroach 不支持。所以我在所有生成的迁移文件(迁移、设计器、模型快照)中将NpgsqlValueGenerationStrategy 更改为SerialColumn。在此更改应用迁移后,调用UserManager.AddClaim 时出现另一个错误。溢出异常。所以我认为这是因为默认情况下,用于 SERIAL 列的 Cockroach 不使用序列,而是根据当前时间戳和节点 ID 生成唯一数字,这会产生一些非常大的数字。 Cockroach 提供了一种通过执行SET experimental_serial_normalization = sql_sequence 来覆盖当前会话的SERIAL 关键字行为的方法。所以我删除了所有表并再次应用迁移,但在此之前将执行上述命令的代码添加到 AppDbContext 的构造函数。应用迁移后,可以删除此代码,因为不再需要它。
完成所有这些操作后,Identity 才能与 CockroachDb 一起使用,但速度非常慢。创建新用户大约需要 4 秒。添加新声明 - 大致相同。与 PostgreSQL 的 ~1 秒相比。
在 Identity 之外将 EF Core 与 Cockroach 一起使用会很慢,但并非不合理。但是将 EF Core 和 Cockroach 与 Identity 结合使用会使性能无法接受。
可能是什么问题?也许改变所有这些东西以使 Identity 与 Cockroach 一起工作会以某种方式搞砸?功能方面一切正常。
【问题讨论】: