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

时间:2015-03-25 20:37:05

标签: 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]));

测试计划包含一个方案列表,可能包含同一方案的多个副本。我的程序现在需要允许用户确定每个测试计划中属于该列表的方案的顺序。

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

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();

为了让用户指定我已添加.AsList(index => index.Column("scenarioOrder"))到我的测试计划映射的方案的顺序。

然后,我尝试使用以下内容更改现有的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开始递增scenarioOrder。对于每个新场景列表,ScenarioOrder必须始终从1开始。

如何在每次插入后重新评估SELECT COUNT,以便我的表在最后有正确的递增scenarioOrder?

1 个答案:

答案 0 :(得分:0)

要从子查询中获取不同的计数,您需要使用correlated subquery。 在这种情况下,子查询计算当前测试计划当前行之前的行数,即排序是旧的ID

INSERT ...
SELECT ...,
       (SELECT COUNT(*)
        FROM tmp AS t2
        WHERE t2.testPlanID = tmp.testPlanID
          AND t2.ID        <= tmp.ID
       ) AS scenarioOrder
FROM tmp