(HINWEIS: Dies ist nicht ein Duplikat von diese Frage , obwohl sie dieselbe Ausnahme hat.
Ich habe eine armer Mann-Transaktion an der Stelle, wo die Strategie ist:
Wenn ich Schritt 3 versuche, erhalte ich folgende Meldung:
Die Operation ist fehlgeschlagen: Die Beziehung konnte nicht geändert werden, da eine oder mehrere Eigenschaften des Fremdschlüssels nicht nullfähig sind. Wenn eine Änderung an einer Beziehung vorgenommen wird, wird die zugehörige Fremdschlüsseleigenschaft auf einen Nullwert festgelegt. Wenn der Fremdschlüssel keine Nullwerte unterstützt, muss eine neue Beziehung definiert werden, der Fremdschlüsseleigenschaft muss ein anderer Wert ungleich Null zugewiesen werden, oder das nicht verwandte Objekt muss gelöscht werden.
Ich verstehe allgemein, was das bedeutet, aber ich dachte, ich würde nach den Regeln spielen und egal wie sehr ich versuche, nach den Regeln zu spielen, ich bin mir nicht sicher, warum ich diese Botschaft bekomme.
Wir verwenden Self-Tracking-Entitäten und mein Code ist effektiv dies:
%Vor% Was ist los mit dieser Logik? Warum kann ich diese beiden Datensätze nicht einfach löschen? Ich habe versucht, MyContext.ApplyChanges
aufzurufen, nachdem ich MarkAsDeleted
aufgerufen habe. Ich habe alle möglichen Dinge ausprobiert und egal was passiert ist, egal wie sehr ich versuche, dem Kontext zu sagen, dass ich beide löschen möchte, es wirft immer wieder diese Ausnahme auf.
@Slauma hat diese Antwort in den obigen Kommentaren angegeben, aber mich gebeten, die Antwort zu posten.
Das Problem besteht darin, dass es in den Vorlagen für Self-Tracking-Entitäten für Entity Framework tatsächlich einen "Fehler" gibt (etwas, das Microsoft nicht mehr empfiehlt). Ein Blogeintrag speziell zu diesem Thema kann hier gefunden werden .
Das Problem ist, dass das ObjectStateManager
des Kontexts nicht mehr mit den (angehängten) Entitäten ChangeTracker.State
übereinstimmt und Sie Objekte mit entity.ChangeTracker.State == ObjectState.Deleted
haben, aber wenn context.ObjectStateManager
denkt, dass der Status gesetzt ist zu EntityState.Unchanged
. Diese beiden sind eindeutig sehr unterschiedlich. Dieser Fix geht also effektiv und sucht nach jedem Objekt, das an den Kontext angehängt ist, als EntityState.Unchanged
, gräbt aber tiefer und überprüft auch die ChangeTracker.State
jedes Objekts für ObjectState.Deleted
, um die Dinge zu reparieren.
Eine einfache und sehr gut funktionierende Umgehung für dieses Problem (das für uns gut funktioniert hat) kann in der T4-Vorlage des Context vorgenommen werden, indem der Block #region Handle Initial Entity State
durch den folgenden Code ersetzt wird:
Tags und Links sql-server c# .net-4.0 entity-framework-4