2016-04-21 26 views
0

könnte mir jemand sagen, wie Problem gelöst:Wie wird der Datensatz korrekt aktualisiert?

Ich möchte meinen Rekord in db aktualisieren:

internal static void ReleaseMachine(int idMachine) 
     { 
      Machine machine = GetByID(idMachine); 
      if (machine != null) 
       machine.idWorker = null; 
     } 

internal static Machine GetByID(int idMachine) 
    { 
     return (from m in Database.Current.Machines where m.idMachine == idMachine select m).FirstOrDefault(); 
    } 

Aber wenn ich versuche, dann wirft das Programm eine Ausnahme:

-System. Data.Linq.ForeignKeyReferenceAlreadyHasValueException,

Der Vorgang ist aufgrund des aktuellen Objektstatus nicht gültig.

Vielen Dank für Hilfe

+0

Sie müssen den Status des EF-Objekts angeben, da EF die Änderungen, die Sie am zurückgegebenen Objekt vorgenommen haben, nicht verfolgen kann. dbcontext.Entry (Maschine) .State = EntityState.Modified; dbcontext.SaveChanges(); – Hakunamatata

Antwort

0

Ich vermute idWorker ein Fremdschlüssel ist, und Sie den Fremdschlüssel setzen auf null, die als Fremdschlüssel nicht mehr nicht erlaubt ist, wird in der referenzierten einen Datensatz entsprechen Tabelle. Dies würde einen verwaisten Datensatz in der referenzierten Tabelle erstellen. Sie müssen den Worker zuerst aus der Datenbank löschen, bevor Sie den Fremdschlüssel entfernen können.

Wenn Sie das Gleiche in einer SQL-Abfrage direkt in der Datenbank versuchen, können Sie den idWorker auch nicht auf null setzen. Wenn Sie den idWorker in der Datenbank direkt auf null setzen können, haben Sie Ihre Entitäten möglicherweise nicht korrekt eingerichtet (in der Entitätseinrichtung ist kein Fremdschlüssel zulässig).

+0

Ich kann Worker von db nicht löschen, ich möchte nichts in Worker-Tabelle tun. – Bortek23

+0

Dann müssen Sie die Fremdschlüsseleigenschaft idWorker in der Machine-Tabelle als Nullable (in Ihrer Datenbank und in der Entität) festlegen ODER Machine den Fremdschlüssel für die Worker-Tabelle erstellen. – garethb

+0

Ich habe bereits beide – Bortek23

0

mit Hakunamatata Agree, das ein Flush/Schließen Problem ist, lösen

dbcontext.Entry(machine).State = EntityState.Modified; 
dbcontext.SaveChanges(); 

Erklären: Vergleichen Sie es mit einer Datei offen zu halten. Sie haben einen NULL-Wert in Ihre Maschinentabelle eingegeben. Sie haben das Framework-Tabellenobjekt zum Schreiben geöffnet, aber der Linq lädt seine Datensätze aus derselben Tabelle. Es weiß nicht, dass Sie mit dem Schreiben fertig sind, also löst es eine Ausnahme aus. Sie müssen lediglich die Änderungen in der Datenbank speichern. Danach kann der Linq-Ausdruck die Tabelle öffnen und daraus lesen.

+0

Alles klar, aber mein dbcontext hat kein Entry.State-Feld. Noch weiß ich nicht, wie ich das Problem lösen kann. – Bortek23

+0

Ok, ich löse das Problem auf andere Weise. Danke für die Hilfe – Bortek23

Verwandte Themen