533 Stimmen

Expliziter Wert für Identitätsspalte in Tabelle 'table' kann nicht eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist

Ich habe den folgenden Fehler, wenn ich das folgende Skript ausführe. Worum handelt es sich bei dem Fehler und wie kann er behoben werden?

Insert table(OperationID,OpDescription,FilterID)
values (20,'Hierachy Update',1)

Fehler:

Server: Msg 544, Ebene 16, Zustand 1, Zeile 1

Es kann kein expliziter Wert für die Identitätsspalte in der Tabelle 'table' eingefügt werden, wenn IDENTITY_INSERT auf OFF gesetzt ist.

2voto

user3542654 Punkte 163

In meinem Fall war ich mit einer anderen Eigenschaft als Schlüssel im Kontext für meine modelBuilder festgelegt.

modelBuilder.Entity<MyTable>().HasKey(t => t.OtherProp);

Ich musste die richtige ID einstellen

 modelBuilder.Entity<MyTable>().HasKey(t => t.Id);

1voto

Prashant Gupta Punkte 619

Auch wenn alles korrekt war, kann dieser Fehler auftreten, wenn der Datentyp der Identity-Spalte nicht int oder long ist. Ich hatte die Identitätsspalte als Dezimalwert, obwohl ich nur Int-Werte gespeichert habe (mein Fehler). Das Ändern des Datentyps sowohl in der Datenbank als auch im zugrunde liegenden Modell hat das Problem für mich behoben.

1voto

codearmalik Punkte 15

Setzen Sie Haltepunkt auf Ihre [HttpPost]-Methode und überprüfen Sie, welcher Wert an Id-Eigenschaft übergeben wird. Wenn der Wert ungleich Null ist, wird dieser Fehler auftreten.

0voto

Hao Deng Punkte 625

Und wenn Sie Oracle SQL Developer für die Verbindung verwenden, denken Sie daran, / sqldev:stmt /

/ sqldev:stmt / set identity_insert TABLE on;

0voto

Andras Punkte 61

Hatte das gleiche Problem mit Entity Framework mit einem Modell wie dieses (ich vereinfachte den ursprünglichen Code):

public class Pipeline
{
  public Pipeline()
  {
     Runs = new HashSet<Run>();
  }

  public int Id {get; set;}
  public ICollection<Run> Runs {get;set;}
}

public class Run
{
  public int Id {get; set;}
  public int RequestId {get; set;}
  public Pipeline Pipeline {get;set;}
}

Der Lauf steht in einem Verhältnis von 1:1 zur Pipeline (eine Pipeline kann mehrfach laufen).

In meinem RunService Ich habe das DbContex wie folgt injiziert context . Der DbContext hatte eine Runs DbSet. Ich habe diese Methode in der RunService :

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId, Pipeline = pipeline};
  context.Runs.Add(newRun);
  await context.SaveChangesAsync().ConfigureAwait(false); // got exception in this line
  return newRun;
}

Als die Methode ausgeführt wurde, erhielt ich diese Ausnahme:

Exception has occurred: CLR/Microsoft.EntityFrameworkCore.DbUpdateException
Exception thrown: 'Microsoft.EntityFrameworkCore.DbUpdateException' in System.Private.CoreLib.dll: 'An error occurred while updating the entries. See the inner exception for details.'
 Inner exceptions found, see $exception in variables window for more details.
 Innermost exception     Microsoft.Data.SqlClient.SqlException : Cannot insert explicit value for identity column in table 'Pipelines' when IDENTITY_INSERT is set to OFF.

Für mich bestand die Lösung darin, die Erstellung von Objekt und Beziehung zu trennen

public async Task<Run> CreateAndInit(int requestId, int pplId)
{
  Pipeline pipeline = await pipelineService.Get(pplId).FirstOrDefaultAsync().ConfigureAwait(false);
  Run newRun = new Run {RequestId = requestId};
  context.Runs.Add(newRun);
  newRun.Pipeline = pipeline; // set the relation separately
  await context.SaveChangesAsync().ConfigureAwait(false); // no exception
  return newRun;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X