LINQ to SQL和IDENTITY_INSERT(Linq To Sql and identi

2019-07-04 10:53发布

我试图做一个表,其中主键是一个记录插入Identity字段。

我已经打过电话
mycontext.ExecuteCommand("SET identity_insert myTable ON")
但是这并没有什么好处。

我得到一个错误说IDENTITY_INSERTOFF时,我提交更改。

我怎样才能把它ON从C#代码之前,我提交更改?

编辑

我已阅读,这是因为ExecuteCommand代码获取不同的会话中执行。

编辑2

有没有什么办法可以执行一些DDL从我的C#代码中删除标识规范,执行插入,然后打开身份规格回来?

Answer 1:

你需要做在一个单一的T-SQL代码块中的所有步骤 - 这将是真的很难,如果不是不可能的,如果你想打开它,然后执行你的LINQ到SQL查询,然后将它关闭:(

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

SET IDENTITY_INSERT MyTable ON

(do your update here)

SET IDENTITY_INSERT MyTable OFF

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

PS:你的编辑#2:没有,不幸的是,有没有(简单)的方式来删除某列的身份,并重新打开它。 Basicall你必须建立一个没有身份的新列,比的值复制,删除标识列,然后做向后当你做一样的 - 对不起! :-(

PS#2:这确实引出了一个问题:究竟是什么做的需要为做一个“标识插入”? 定期,从一个应用程序? 诚然 - 在我的应用程序肯定不......(只是好奇你的使用情况/动机是什么) - 你可能在一段时间碰上这种需要一次,但我总是这样做分开,在SQL管理工作室。



Answer 2:

另一种选择是包装在一个TransactionScope所有LINQ2SQL()的调用。 这应该强制他们都在同一个连接上运行。

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();
       }
       // ...

尽管如此,如果你正在尝试做一些事情,如:

context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.MyTable.InsertOnSubmit(myTableObject)
context.SubmitChanges()
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");

你可能会遇到的其他问题,特别是如果身份列具有IsDbGenerated属性设置为true。 通过LINQ2SQL生成的SQL命令不知道要包括标识列和值。



Answer 3:

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

context.Connection.Open();
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
// make changes
// ...
context.SubmitChanges();


Answer 4:

我所做的就是这样的事情(Nbuider用于创建实体)。 我创建除了标识插入行通常都行; 这到底做了些什么。 这是测试数据生成,因此并不需要交易。

using (var entitiesEfContext = new ContextABC())
{

    var platforms = Builder<Platform>
                                .CreateListOfSize(4)
                                .TheFirst(1)
                                .With(x => x.Description = "Desc1")
                                .With(x => x.IsDeleted = false)
                                .TheNext(1)
                                .With(x => x.Description = "Desc2")
                                .With(x => x.IsDeleted = false)
                                .TheNext(1)
                                .With(x => x.Description = "Desc3")
                                .With(x => x.IsDeleted = false)
                                .TheNext(1)
                                .With(x => x.Description = "Desc4")
                                .With(x => x.IsDeleted = false)
                                .Build();
                foreach (var platform in platforms)
                {
                    entitiesEfContext.Platform.AddObject(platform);
                }
                entitiesEfContext.SaveChanges();

              // the identity insert row (o as id in my case)

               entitiesEfContext.ExecuteStoreCommand("SET IDENTITY_INSERT Platform ON; INSERT INTO [Platform](Platformid,[Description],[IsDeleted],[Created],[Updated]) VALUES (0,'Desc0' ,0 ,getutcdate(),getutcdate());SET IDENTITY_INSERT Platform Off");


              }


Answer 5:

我有同样的错误消息。 我通过更改表的主键的属性解决。

MyTable.MyId int IDENTITY(1,1) NOT NULL

该属性设置身份识别码(在DBML)

  • 自动生成的值:True;
  • 自动同步:OnInsert;
  • 主键: ;
  • 服务器数据类型:int NOT NULL身份 ;
  • 类型:int;


Answer 6:

只是简单的reseed identity key (通过自定义ID),每次添加新的记录,如时间:

    using (var desDb = new DesDbContext())
    {
        // del-table-all --------------------------------------------------------
        desDb.Database.ExecuteSqlCommand("DELETE FROM [Products]");

        foreach (var desItem in desList) //desList is List of Product
        {
            // reseed identity key
            desDb.Database.ExecuteSqlCommand("DBCC CHECKIDENT('Products', RESEED," 
                + (desItem.ProductID - 1) + ");");

            // and record
            desDb.Products.Add(desItem);                        

            // save-db                    
            desDb.SaveChanges();

        }
    }


文章来源: Linq To Sql and identity_insert