Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Linq To Sql und identity_insert

Eine weitere Option besteht darin, alle Ihre Linq2Sql-Aufrufe in einem TransactionScope() zu verpacken. Dies sollte sie alle dazu zwingen, in derselben Verbindung zu laufen.

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

Wenn Sie jedoch versuchen, Folgendes zu tun:

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

Sie werden wahrscheinlich auf andere Probleme stoßen, insbesondere wenn in der Identitätsspalte das IsDbGenerated-Attribut auf „true“ gesetzt ist. Der von Linq2Sql generierte SQL-Befehl weiß nicht, ob er die Identitätsspalte und den Wert enthalten soll.