无法将自定义值插入标识列 - 实体框架

时间:2012-10-04 15:58:06

标签: c# entity-framework entity-framework-4 entity-framework-4.1 identity

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

  1. 将标识列
  2. 的属性StoredGeneratedPattern更改为None
  3. 通过以xml格式打开,将EDMX文件中的属性StoredGeneratedPattern更改为None
  4. 尝试使用以下代码

    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

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

2 个答案:

答案 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);