Ich habe eine Tabelle, die zusätzliche Daten für einige Zeilen einer Tabelle wie speichert:Entity Framework-Code erster Migrations: Set Primärschlüsselwert
public class QuoteExtra
{
[Key]
public int QuoteId { get; set; }
// More fields here
}
Ich mag würde zu können, fügen Sie Zeilen dieser Tabelle wo ich den PK explizit setze.
Wenn ich es einfach wie oben belassen habe, wird durch Setzen eines Werts und Übergeben der Zeile der Wert verworfen und durch den automatisch generierten Wert aus der Datenbank ersetzt (und die Spalte wird im aktuellen Schema als Identitätsspalte definiert)).
Dies scheint die richtige Lösung zu sein:
public class QuoteExtra
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int QuoteId { get; set; }
// More fields here
}
dies jedoch stattdessen wird mir die Ausnahme:
Kann nicht expliziten Wert für Identitätsspalte in der Tabelle ‚EnumTest‘ einfügen, wenn IDENTITY_INSERT eingestellt wird AUS.
Also, wie schreibe ich meine Klasse, so dass ich den Wert eines Primärschlüssels in EF festlegen kann?
Edit:
ich das Hinzufügen versuchte die folgende Code-basierte Migration IDENTITY_INSERT auf ON zu setzen:
public override void Up()
{
Sql("SET IDENTITY_INSERT QuoteExtra ON");
}
ich es lief und versuchte es noch einmal, aber bekam die gleiche Ausnahme wie oben. Was seltsam ist, ist, dass die Datenbank diese Einstellung widerspiegelt, und das direkte Ausführen von SQL erlaubt mir, willkürliche Werte für den Primärschlüssel einzufügen - so scheint es, dass Entity Framework selbst diese Regel durchsetzt und nicht erkennt, dass IDENTITY_INSERT nicht drin ist Tatsache ausgeschaltet. Muss ich es irgendwo in EF selbst einstellen?
Edit 2:
I IDENTITY_INSERT falsch verstanden; Ich nahm an, es einmal für diesen Tisch auf unbestimmte Zeit zu setzen. In der Tat lebt es so lange wie die "Session", was bedeutet, dass zum Beispiel das Setzen in einer Migration bedeutet, dass es lebt ... solange diese Migration läuft und keine Auswirkungen auf zukünftige Verbindungen wie meine spätere .Add() mit EF hat Das erklärt, warum ich immer noch diese Ausnahme habe - die DB ist wirklich die Quelle der Ausnahme, nicht EF. Da IDENTITY_INSERT auf höchstens eine Tabelle pro Sitzung beschränkt ist, ist dies eine ziemlich ineffiziente Art und Weise - das Erstellen einer Identity PK-Spalte an erster Stelle scheint eine bessere Route zu sein.
Was meinst du mit * Was seltsam ist die Datenbank diese Einstellung widerspiegelt *? –
Was ich meinte war, dass ich Werte einfügen konnte, wenn ich nach dem Ausführen des identity_insert on-Befehls Raw-SQL verwendete - aber jetzt sehe ich, warum -, weil die Einstellung für die Dauer einer Sitzung und in Raw-SQL aktiviert ist In Sql Server Management Studio blieb ich innerhalb einer Sitzung, während meine EF Migration und der folgende Testcode getrennte Sitzungen waren. –
Ja. Die Identity-Einfügung bezieht sich auf die Verbindung. Wenn Sie sicherstellen, dass der Code in derselben Verbindung ausgeführt wird, sollten Sie ihn verwenden können. Aber es ist irgendwie schwarze Magie, besonders wenn man über Migrationen nachdenkt. –