Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Linq para Sql e identity_insert


Outra opção é envolver todas as suas chamadas Linq2Sql em um TransactionScope(). Isso deve forçar todos eles a serem executados na mesma conexão.
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();
       }
       // ...

Embora, se você estiver tentando fazer algo como:
context.ExecuteCommand("SET IDENTITY_INSERT MyTable ON");
context.MyTable.InsertOnSubmit(myTableObject)
context.SubmitChanges()
context.ExecuteCommand("SET IDENTITY_INSERT MyTable OFF");

você provavelmente terá outros problemas, especialmente se a coluna de identidade tiver o atributo IsDbGenerated definido como true. O comando SQL gerado pelo Linq2Sql não saberá incluir a coluna de identidade e o valor.