具有自动增量值

时间:2018-04-05 01:30:30

标签: sqlite composite-primary-key composite-key database-trigger

我正在使用AspNetCore和Entity Framework Core开发一个应用程序,它支持两个数据库提供程序SqlServer和Sqlite。我定义了以下Code First类

public class Document {
    public Guid Id { get; set; }
}

public class DocumentSection {
    public Guid DocumentId { get; set; }
    public int SectionId { get; set; }
}

当简单地将SectionId声明为自动增量时,这适用于SqlServer,但Sqlite不支持此功能。

我希望获得的最佳最终结果是(为简单起见,让DocumentIdint

PK

(1)   Document XYZ
(2)   Document foo

(1,1) Header Section (Doc 1)
(1,2) Main Body      (Doc 1)
(2,1) Header         (Doc 2)
(2,2) Body           (Doc 2)
(2,3) Footer         (Doc 2)

只是将复合键的一部分设置为自动增量适用于SqlServer,但SQLite并不支持这种开箱即用的功能。这实际上没问题,因为我预计不会接近int.MAX。所以"次优"在SqlServer上工作的解决方案生成以下内容:

(1,1)
(1,2)
(2,3)
(2,4)
(2,5)

这可以通过触发器解决,但我的SQL技能几乎不存在。这是我到目前为止所提出的:

CREATE TRIGGER SectionTrigger
INSTEAD OF INSERT ON DocumentSection
BEGIN
    INSERT INTO DocumentSection (DocumentId, SectionId, otherValue)
    VALUES (
      NEW.DocumentId,
      (SELECT max(SectionId) + 1 FROM DocumentSection WHERE DocumentId = NEW.DocumentId),
      NEW.otherValue);
END;

结果

cannot create INSTEAD OF trigger on table: ContractSection: CREATE TRIGGER SectionTrigger
INSTEAD OF INSERT ON ContractSection
BEGIN

我查看了Create Trigger Documentation,但无法弄明白。我想我可以忍受"次优的" SqlServer(以及Sqlite)的解决方案,因为添加触发器需要手动编辑EF Core迁移代码,我当然希望这样做。

编辑:AFTER触发器当然也没问题。

0 个答案:

没有答案