1. 程式人生 > 其它 >EF 6 / Postgresq 自增序列作為主鍵

EF 6 / Postgresq 自增序列作為主鍵

序列將在資料庫中生成唯一的順序數值。 序列不與特定表相關聯,並且可以將多個表設定為從同一序列中繪製值。

目標是一個可自定起始值的自增序列,在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`不被認為是同一個序列,所以完整的例子為:
```csharp
   modelBuilder.HasSequence<int>("OrderNumbers")
                .StartsAt(1000)

    modelBuilder.Entity<Order>()
                .Property(o => o.OrderNo)
                .HasDefaultValueSql("nextval('\"OrderNumbers\"')");
站外部落格地址:https://blog.yuhang.ch