【问题标题】:Unit testing with identity columns使用标识列进行单元测试
【发布时间】:2012-02-22 22:17:30
【问题描述】:

我在我的 SQL Server 表中使用IDENTITY 列。

我有一个单元测试,我删除了具有特定 ID 的数据记录。

当我插入测试数据时,我得到了这个异常:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“MyTablename”中的标识列插入显式值

然后我在我的管理工作室做一个快速测试:

SET IDENTITY_INSERT MyTablename ON

上面写着Command(s) completed successfully.

我重新运行单元测试,但仍然出现同样的错误。

一般情况下我该怎么做?我希望包含所有表的单元测试数据库允许我为标识列手动插入值。

【问题讨论】:

  • 这很奇怪——我今天刚做了,效果很好。我只使用 SQL Server,而不是 C#(我是从管理工作室中插入的)。

标签: c# sql-server unit-testing identity-column


【解决方案1】:

SET IDENTITY_INSERT 是特定于会话的。您不能在 SSMS 中将其设置为 true,然后在其他设备中运行单元测试。 SET 命令必须是单元测试代码的一部分。

此外,您一次只能将此设置设置为一个表,因此除非您根据需要设置每个表,否则您的单元测试似乎不会很好地工作。

【讨论】:

  • 所以我必须在运行单元测试时将 Table1 上的它设置为 ON。当我对 Table2 进行另一次测试时,我必须首先在 TAble1 将其设置为 OFF 吗?然后在 Table2 将其设置为 ON ?我是否可以假设“SET IDENTITY_INSERT MyTablename ON”可以放入 CommandText 并且 ExecuteNonQuery 将设置它?
  • 我不确定对 ExecuteNonQuery 的单独调用是否会在该调用之后持续存在 - 取决于我怀疑您的连接是如何利用的。修改实际插入 tableX 的批处理可能更安全 - 在批处理开始时将 SET IDENTITY_INSERT ON,并在最后(或在为 tableY、tableZ 等设置之前)将其关闭。
  • 就像一个魅力。似乎我必须扩展我的 sql 单元测试助手:P。谢谢伯特兰:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2011-11-16
  • 2015-05-28
  • 2012-05-23
  • 2010-11-30
  • 2010-12-31
相关资源
最近更新 更多