2009-07-22 6 views
5

Ich habe ein einfaches Problem, liest eine Excel-Datei (mit Interop) und füllt eine MSSQL-Datenbank-Datei mit einigen Daten daraus extrahiert. Das ist soweit in Ordnung. Ich habe ein Geschäft Tabelle mit den folgenden Feldern:LINQ to SQL - Die Datenbank generiert einen Schlüssel, der bereits verwendet wird

  • ID: int, automatisch generiert, auto-sync: auf dem Einsatz
  • Name: String
  • Settlement: string
  • Landkreis: string
  • Adresse: string

las ich die Excel-Datei, und dann eine neue Shops erstellen Objekt und den Namen, die Abrechnung, County und Anschrift propert gesetzt Ich rufe Shops.InsertOnSubmit() mit dem neuen Shop-Objekt an.

Danach muss ich die Datenbank zurücksetzen (zumindest die Tabelle), für die der einfachste Weg, den ich gefunden habe, war, die DeleteDatabase() -Methode aufzurufen und CreateDatabase() erneut aufzurufen. Das Problem ist, dass nach dem ersten Reset, wenn ich versuche, die Tabelle erneut zu füllen, bekomme ich die Ausnahme: Die Datenbank generiert einen Schlüssel, der bereits verwendet wird.

Darüber hinaus kann ich diese Datenbankdatei nicht mehr verwenden, da DatabaseExists() FALSE zurückgibt, aber wenn ich die CreateDatabase() Methode aufruft, löst es eine Ausnahme aus, dass die Datenbank bereits existiert (obwohl die Datendateien sind nicht vorhanden).

Was mache ich falsch? Vielen Dank im Voraus!

Antwort

4

Es klingt, als würden Sie den Datenkontext über das, was sinnvoll ist, wiederverwenden. Versuchen Sie, den Datenkontext nach dem Löschen der Datenbank zu löschen und neu zu erstellen.

Ich vermute, das Problem ist, dass der Identity Manager immer noch Objekte verfolgt (das Zerstören und Wiederherstellen der Datenbank ist solch ein Randfall, dass wir ihm verzeihen können, dass er sich hier nicht zurückgesetzt hat).

+0

Vielen Dank, habe ich den Datenkontext nach dem Löschen der Datenbank entsorgt und dann wieder instantiiert und neu erstellt, so dass es jetzt funktioniert. Vielen Dank! Noch eine Sache: Wie kann ich die von mir erstellten Datenbanken "freigeben"? MSSQL erlaubt mir nicht, Datenbanken mit diesem Namen zu erstellen ... – ShdNx

+0

Ich weiß nicht, fürchte ich. –

+1

Danke. Ich hatte ein ähnliches Problem, weil ich ASP.Net Development Server bei der Neuverteilung der Datenbank ausgeführt habe. Ich muss daran denken, den Development Server vor der erneuten Bereitstellung herunterzufahren. –

2

Ich habe diesen Fehler festgestellt. Ich hatte einen Log-Tisch mit einer Identität. Ich habe das Protokoll abgeschnitten, während meine Anwendung ausgeführt wurde. Was passierte, war, dass die DB die Identitätsspalte erneut starten würde, wenn ich abgeschnitten hätte, aber der Datenkontext, den ich zum Loggen verwendete, hatte immer noch Objekte, die er mit dem gleichen Schlüssel verfolgte.

0

Ich habe diesen Fehler gefunden, weil ich eine benutzerdefinierte gespeicherte Prozedur für die Einfügung mit einer Tabelle verwendet, die eine Identitätsspalte hatte, aber ich hatte vergessen, "SET @ Id = SCOPE_IDENTITY" am Ende meiner Sproc.

Ich habe den resultierenden Identitätswert nicht verwendet, daher tauchte das Problem nur auf, wenn ich zwei oder mehr Zeilen einfügte. Tricky Fehler.

+0

Ich scheine den gleichen Fehler zu begegnen, setzen Sie @Id als Ausgabeparameter des SP? – liang

+0

Ich habe wahrscheinlich @Id als Ausgabeparameter verwendet. Sorry, ich kann mich nicht erinnern, das war vor langer Zeit und mein Gedächtnis ist nicht so stark :). –