Die Beziehung konnte nicht geändert werden, da eine oder mehrere Fremdschlüsseleigenschaften nicht nullfähig sind

8

(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:

  1. Fügen Sie einen übergeordneten und untergeordneten Datensatz ein.
  2. Führen Sie eine lang andauernde Operation aus.
  3. Wenn der lang andauernde Vorgang fehlschlägt, löschen Sie die zuvor eingefügten übergeordneten und untergeordneten Datensätze.

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.

    
Jaxidian 13.04.2013, 22:08
quelle

1 Antwort

4

@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:

%Vor%     
Jaxidian 14.04.2013, 19:46
quelle