Nhibernate 将非主键递增变量插入Sqlite DB

Nhibernate 将非主键递增变量插入Sqlite DB,nhibernate,sqlite,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Sqlite,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个将两个对象链接在一起的矩阵表 CREATE TABLE [TPS_TestPlanScenarioMatrix] ( [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]), [scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID])); 测试计划包含场景列表,并且

我有一个将两个对象链接在一起的矩阵表

CREATE TABLE [TPS_TestPlanScenarioMatrix] (
  [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  [testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
  [scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]));
测试计划包含场景列表,并且可能包含同一场景的多个副本。我的程序现在需要允许用户确定每个测试计划中属于列表的场景的顺序

我正在使用Fluent NHibernate将Sqlite DB表映射到项目中的实体。我当前的测试计划映射如下:

Table("TPS_TestPlan");
        Id(x => x.Id).Column("testPlanID");
        Map(x => x.Name).Column("testPlanName");
        Map(x => x.Description).Column("testPlanDescription");

        HasManyToMany(x => x.Scenarios)
            .Table("TPS_TestPlanScenarioMatrix")
            .ParentKeyColumn("testPlanID")
            .ChildKeyColumn("scenarioID")
            .Cascade.None();
为了允许用户指定我添加到测试计划映射中的场景的顺序。AsListindex=>index.columnsecenariorder

然后,我尝试更改现有的Sqlite矩阵表,并使用以下方法在任何以前存在的测试计划场景连接中进行迁移:

ALTER TABLE TPS_TestPlanScenarioMatrix RENAME TO tmp;

CREATE TABLE [TPS_TestPlanScenarioMatrix] (
   [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
   [testPlanID] INTEGER REFERENCES [TPS_TestPlan]([testPlanID]),
   [scenarioID] INTEGER REFERENCES [TPS_Scenarios]([ID]),
   [scenarioOrder] INTEGER);

INSERT INTO TPS_TestPlanScenarioMatrix(testPlanID,scenarioID,scenarioOrder)
  SELECT testPlanID,scenarioID,
    CASE WHEN EXISTS(SELECT testPlanID FROM TPS_TestPlanScenarioMatrix)
      THEN (SELECT COUNT(testPlanID) FROM TPS_TestPlanScenarioMatrix)
      ELSE 1 
    END as scenarioOrder
  FROM tmp;

DROP TABLE tmp;
但是scenarioOrder始终输入为1,因为SELECT COUNT语句在每次插入后都不会重新计算。我需要将每个场景映射到同一个测试计划,使场景顺序从1到N递增。对于每个新场景列表,场景顺序必须始终从1开始


如何在每次插入后获得要重新计算的SELECT计数,以便我的表在末尾具有正确的递增顺序?

要从子查询中获得不同的计数,需要使用。 在这种情况下,子查询统计当前测试计划的当前行之前有多少行,即排序是按旧ID进行的:


不要在目标表中计数,而是在源表中计数。如果替换要从tmp使用的then语句,由于新的矩阵表仍然为空,因此每次仍然得到1。如果我用tmp替换case语句中TPS_TestPlanScenarioMatrix的两个实例,我每次只收到max testplanID。
INSERT ...
SELECT ...,
       (SELECT COUNT(*)
        FROM tmp AS t2
        WHERE t2.testPlanID = tmp.testPlanID
          AND t2.ID        <= tmp.ID
       ) AS scenarioOrder
FROM tmp