EF Core / 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不被認為是同一個序列,所以完整的例子為:

   modelBuilder.HasSequence<int>("OrderNumbers")
                .StartsAt(1000)

    modelBuilder.Entity<Order>()
                .Property(o => o.OrderNo)
                .HasDefaultValueSql("nextval('\"OrderNumbers\"')");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM