5

我正在尝试关闭身份以插入我自己的值,我遵循的步骤

  1. 将标识列 的属性StoredGeneratedPattern值更改为None
  2. 通过以 xml 格式打开将属性StoredGeneratedPattern值更改为 EDMX 文件None

尝试使用以下代码

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
   int k = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client ON");
   Context.ClientInfoes.Add(testclient);
   result = Context.SaveChanges();
   int j = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client OFF");
   scope.Complete();
}

但我仍然收到错误

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

我错过了什么吗?还有其他选择吗?

4

2 回答 2

0

请参阅此处的类似问题。

埃兰加解释说:

ExecuteSqlCommand将打开连接,执行 sql 然后关闭它。因此,您的下一个命令将使用不同的连接执行。

ExecuteSqlCommand 方法类似于 ExecuteStoreCommand。

Daniel Liuzzi 解释说:

...诀窍是将所有内容打包到一个命令中...

例如,

string sqlStatement = "SET IDENTITY_INSERT clientInfo ON;" +
string.Format("INSERT clientInfo (ClientInfoId, Column1, Column2) VALUES ({0}, {1}, {2}, '{3}');", testClient.ClientInfoId, testClient.Column1, testclient.Column2) +
"SET IDENTITY_INSERT clientInfo OFF";
context.ExecuteStoreCommand(sqlStatement);
于 2013-12-19T20:33:10.290 回答
0

当您调用 TransactionScope.Complete 时,数据存储在数据库中,而不是在您调用 ClientInfoes.Add 或 Context.SaveChanges 时。所以你可以看到,当调用插入语句时,你已经关闭了 IDENTITY INSERT。

简单地重新排列东西...

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
   int k = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client ON");
   Context.ClientInfoes.Add(testclient);
   result = Context.SaveChanges();
   scope.Complete();
   int j = Context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.client OFF");
}

更好的是,在事务之外对 IDENTITY_INSERT 进行所有更改,因为它的值是特定于会话的(每个会话只能为一个表打开它)。

于 2012-12-21T11:12:14.220 回答