5

Ich versuche, die Identität auszuschalten meinen eigenen Wert zu legen, Schritte, die ich gefolgtKann nicht benutzerdefinierten Wert in Identitätsspalte Einfügen - Entity Framework

  1. die Eigenschaft StoredGeneratedPattern Wert None für die Identitätsspalte geändert
  2. die Eigenschaft StoredGeneratedPattern Wert None in EDMX-Datei geändert durch Öffnen im xML-Format

Versuchte den Code unten mit

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

aber ich erhalte noch die Störung

Kann nicht expliziten Wert für Identitätsspalte in Tabelle einfügen, wenn IDENTITY_INSERT gesetzt ist auf OFF

bin ich etwas fehlt? Gibt es noch andere Möglichkeiten?

+0

Ihr Kontext sagt ClientInfoes, aber deine sQL ist dbo.client. wird ClientInfoes dem Client zugeordnet? oder eine Clienteinfügetabelle? –

+0

Clienteinfos zu Client, Client ist die Tabelle in SQL. Ohne die Identität funktioniert die Einfügung einwandfrei, aber meine Anforderung besteht darin, eine benutzerdefinierte Client-ID zu übergeben. – Vamsi

Antwort

0

Die Daten werden beim Aufruf von TransactionScope.Complete in der Datenbank gespeichert, nicht beim Aufruf von ClientInfoes.Add oder Context.SaveChanges. Sie können also sehen, dass Sie beim Aufruf der INSERT-Anweisung IDENTITY INSERT bereits ausgeschaltet haben.

einfach Dinge neu ordnen ...

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"); 
} 

Noch besser wäre es, alles tun, um die Änderungen außerhalb der Transaktion identity_insert da es Wert ist, ist sitzungsspezifisch (Sie können es nur dann eingeschaltet pro Sitzung für eine Tabelle haben) .

0

Siehe ähnliche Frage here.

Eranga erklärt:

ExecuteSqlCommand wird die Verbindung öffnen, führen Sie die SQL und dann zu schließen. Also wird der nächste Befehl mit einer anderen Verbindung ausgeführt.

Die ExecuteSqlCommand-Methode ähnelt dem ExecuteStoreCommand.

Daniel Liuzzi erklärt:

... der Trick, alles in einem einzigen Befehl packt ...

So zum Beispiel,

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); 
+1

Sie möchten dieses 'string.Format' entfernen und Ihren Befehl richtig parametrisieren; Andernfalls setzen Sie sich SQL Injection-Angriffen aus. –

Verwandte Themen