【发布时间】:2022-12-07 22:32:17
【问题描述】:
我最近一直在使用 PostgreSQL 而不是 SQL,因此发现两者之间有很多细微差别。
我希望能够使表中的字符串值唯一,因此使用 EF code first fluent API,我有这段代码。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyTable>()
.HasIndex(u => u.UniqueValue)
.IsUnique();
base.OnModelCreating(modelBuilder);
}
创建迁移时,它会生成这个。
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_MyTable_UniqueValue",
table: "MyTable",
column: "UniqueValue",
unique: true);
}
然后,这会将索引添加到 PostgreSQL 表中,并在单词大小写相同时起作用。
例如尝试插入两次“Hello”,但它不起作用。
它确实允许单词的变体,所以我可以插入“Hello”、“HEllo”、“HELlo”等...
看起来可以使用类似的东西在 PostgreSQL 的索引上强制大小写
CREATE UNIQUE INDEX UniqueValue ON MyTable (UPPER(UniqueValue));
但是我不确定如何通过 EF Fluent API 执行此操作并从中创建迁移?
【问题讨论】:
-
看起来现在你必须设置一个raw SQL migration。支持是stillon the way。您还可以设置一个 generated (computed) column 来执行您的
upper(UniqueValue)并在其上添加唯一索引。 -
感谢@Zegarek 提供的信息您不会碰巧拥有用于更改现有索引并添加到
upper部分的原始 sql 吗? -
您不能以这种方式更改索引,因为它会有效地构建一个新索引,只是重新使用名称。您需要删除您现在拥有的那个,并使用问题中的索引定义来替换它。或者,您可以添加一个单独的 exclusion constraint,效果相同。 Demo。
-
这是很好的信息,谢谢@Zegarek 如果你想将 cmets 重新塑造成一个答案,那么我可以接受。
标签: postgresql entity-framework-core ef-fluent-api