EF 6 / Postgresq 自增序列作為主鍵
阿新 • • 發佈:2021-11-24
序列將在資料庫中生成唯一的順序數值。 序列不與特定表相關聯,並且可以將多個表設定為從同一序列中繪製值。
目標是一個可自定起始值的自增序列,在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);
翻譯為
站外部落格地址:https://blog.yuhang.chCREATE SEQUENCE shared."OrderNumbers" START WITH 100000000 INCREMENT BY 1 NO MINVALUE NO MAXVALUE NO CYCLE; 而`shared."OrderNumbers"`和`shared.OrderNumbers`不被認為是同一個序列,所以完整的例子為: ```csharp modelBuilder.HasSequence<int>("OrderNumbers") .StartsAt(1000) modelBuilder.Entity<Order>() .Property(o => o.OrderNo) .HasDefaultValueSql("nextval('\"OrderNumbers\"')");