我正在使用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不支持此功能。
我希望获得的最佳最终结果是(为简单起见,让DocumentId
为int
)
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触发器当然也没问题。