首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq To Sql和identity_insert

Linq To Sql和identity_insert
EN

Stack Overflow用户
提问于 2009-09-02 17:07:30
回答 6查看 12.2K关注 0票数 5

我正尝试在主键为Identity字段的表上插入记录。

我试着给你打电话

mycontext.ExecuteCommand("SET identity_insert myTable ON")

但这不会有任何好处。

当我提交更改时,我收到一个错误,告诉我IDENTITY_INSERTOFF

在提交更改之前,如何从C#代码中将其转换为ON

编辑

我读到这是因为ExecuteCommand的代码是在不同的会话中执行的。

编辑2

有没有办法我可以执行一些动态链接库来从我的C#代码中删除身份规范,执行插入,然后打开身份规范?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-09-02 17:19:39

您需要在单个T-SQL代码块中完成所有步骤-如果您想打开它,然后执行LINQ- to -SQL查询,然后再关闭它,这将是非常困难的,如果不是不可能的话:(

我看到的唯一真正的解决方案是将整个SQL打包到一个SQL语句中并执行该语句:

代码语言:javascript
复制
SET IDENTITY_INSERT MyTable ON

(do your update here)

SET IDENTITY_INSERT MyTable OFF

并使用.ExecuteContext()将其作为单个代码块执行

Marc

PS:对于你的EDIT#2 :不,不幸的是,没有(简单的)方法可以从一列中删除身份,并将其重新打开。基本情况下,您必须创建一个没有标识的新列,复制值,删除标识列,然后在完成后反向执行相同的操作-对不起!:-(

PS #2:这确实回避了一个问题:到底要做什么才能做“身份插入”?在常规的基础上,从应用程序?诚然-你可能偶尔会遇到这种需要,但我总是在SQL Mgmt Studio中单独做这件事-当然不是在我的应用程序中.(只是好奇你的用例/动机是什么)。

票数 4
EN

Stack Overflow用户

发布于 2010-03-19 01:28:16

另一种选择是将所有Linq2Sql调用包装在一个TransactionScope()中。这应该会强制它们都在同一个连接中运行。

代码语言:javascript
复制
using System.Transactions; // Be sure to add a reference to System.Transactions.dll to your project.

       // ... in a method somewhere ...
       using (System.Transaction.TransactionScope trans = new TransactionScope())
       {
          using(YourDataContext context = new YourDataContext())
          {
             context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");

             context.ExecuteCommand("yourInsertCommand");

             context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");
          }
          trans.Complete();
       }
       // ...

尽管如此,如果您正在尝试执行以下操作:

代码语言:javascript
复制
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.MyTable.InsertOnSubmit(myTableObject)
context.SubmitChanges()
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");

您可能会遇到其他问题,特别是当identity列的IsDbGenerated属性设置为true时。由Linq2Sql生成的SQL命令将不知道是否包含标识列和值。

票数 19
EN

Stack Overflow用户

发布于 2013-06-03 16:08:02

在执行命令之前手动打开连接应该就足够了。这会使命令在同一会话中运行:

代码语言:javascript
复制
context.Connection.Open();
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
// make changes
// ...
context.SubmitChanges();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1368987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档