我正在尝试关闭身份以插入我自己的值,我遵循的步骤
StoredGeneratedPattern
更改为None
StoredGeneratedPattern
更改为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
我错过了什么吗?还有其他选择吗?
答案 0 :(得分:0)
当您调用TransactionScope.Complete时,数据存储在数据库中,而不是在调用ClientInfoes.Add或Context.SaveChanges时。因此,您可以看到,当调用insert语句时,您已经将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进行所有更改,因为它的值是特定于会话的(每个会话只能为一个表启用它)。
答案 1 :(得分:0)
查看类似问题here。
Eranga解释道:
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);