序列將在數據庫中生成唯一的順序數值。 序列不與特定表相關聯,並且可以將多個表設置為從同一序列中繪制值。
目標是一個可自定起始值的自增序列,在EF6中本來希望使用注解的方式,但沒找到方法,只能使用Fluent API
。
https://docs.microsoft.com/zh-cn/ef/core/modeling/sequences
官方文檔的例子是:
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared")
.StartsAt(1000)
modelBuilder.Entity<Order>()
.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR shared.OrderNumbers");
開始沒注意這是SQL Server的方言,使用出了問題,在postgresql中使用需要注意兩點:
比較明顯的是獲取序列的下個值的語法,NEXT VALUE FOR shared.OrderNumbers
>> nextval('\"OrderNumbers\"')
,其次就是序列名字需使用雙括號""
包裹。
https://www.npgsql.org/efcore/modeling/generated-properties.html#standard-sequence-driven-columns
在npgsql的文檔中也是這么做的,原因是ef/npgsql將這一句
modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared") .StartsAt(1000);
翻譯為
CREATE SEQUENCE shared."OrderNumbers" START WITH 100000000 INCREMENT BY 1 NO MINVALUE NO MAXVALUE NO CYCLE;
而shared."OrderNumbers"
和shared.OrderNumbers
不被認為是同一個序列,所以完整的例子為:
modelBuilder.HasSequence<int>("OrderNumbers")
.StartsAt(1000)
modelBuilder.Entity<Order>()
.Property(o => o.OrderNo)
.HasDefaultValueSql("nextval('\"OrderNumbers\"')");