Entity Framework speichert keine Änderungen an der neuen Entität mit einer Beziehung auf zwei Ebenen

entity-framework savechanges

Frage

Ich baue eine ASP.NET MVC-Site mit ADO.NET Entity Framework. Ich habe ein Entitätsmodell, das diese Entitäten enthält, die durch Fremdschlüssel verknüpft sind:

Bericht (ID, Datum, Überschrift, Report_Type_ID usw.)

  • Unterbericht (ID, ReportText usw.) - Eins-zu-Eins-Beziehung zu Report.
    • ReportSource (ID, Name, Beschreibung) - Eins-zu-Viele-Beziehung zu Sub_Report.
      • ReportSourceType (ID, Name, Beschreibung) - One-to-Many-Beziehung zu ReportSource.
      • Kontakt (ID, Name, Adresse usw.) - Eins-zu-Eins-Beziehung mit Report_Source.

Es gibt eine Create.aspx-Seite für jeden SubReport-Typ. Die Post-Event-Methode gibt eine neue Sub_Report-Entität zurück.

Vorher habe ich in meiner Post-Methode diesem Prozess gefolgt:

  1. Legen Sie die Eigenschaften für eine neue Berichtsentität aus den Feldern der Seite fest.
  2. Legen Sie die spezifischen Eigenschaften der SubReport-Entität in den Feldern der Seite fest.
  3. Legen Sie den Unterbericht der Unterberichtseinheit auf die in 1 erstellte neue Berichtsentität fest.
  4. Suchen Sie nach einer von der Seite bereitgestellten ID die ReportSource und setzen Sie die ReportSource der Sub_Report-Entität auf die gefundene Entität.
  5. Änderungen speichern.

Dieser Workflow war für ein paar Wochen gut gelungen. Dann hat sich letzte Woche etwas geändert und es funktioniert nicht mehr. Jetzt bekomme ich anstelle des Speichervorgangs diese Ausnahme:

UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' 
participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 
0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."

Der Debug-Visualizer zeigt Folgendes:

  • Die ReportSource des SubReports wird festgelegt und geladen, und alle Eigenschaften sind korrekt.
  • Der Report_Source ist eine gültige ReportSourceType-Entität zugeordnet.

In SQL Profiler sieht die vorbereitete SQL-Anweisung OK aus. Kann mir jemand zeigen, was offensichtlich ist, was mir fehlt?

TIA

Hinweise: Der Bericht und der Unterbericht sind in diesem Fall immer neue Entitäten. Die Berichtsentität enthält Eigenschaften, die vielen Berichtstypen gemeinsam sind, und wird für generische Abfragen verwendet. UnterReports sind spezifische Berichte mit zusätzlichen Parametern, die je nach Typ variieren. Für jeden SubReport-Typ gibt es tatsächlich ein anderes Entity-Set, aber diese Frage gilt für alle. Daher verwende ich SubReport als vereinfachtes Beispiel.

Akzeptierte Antwort

Dies ist in der Regel der Fall, wenn Ihre Datenbanktabellen eine 1 - 1-Beziehung zueinander haben. In Ihrem Beispiel-Berichtssatz erwartet Sie einen Berichtssortyp mit der ID, auf die er verweist. Ich bin auf dieses Problem gestoßen, wenn meine Beziehung zwei Primärschlüssel aus gegenüberliegenden Tabellen miteinander verbindet.


Beliebte Antwort

Ich weiß, dass ich zu spät dran bin, aber ich hatte ein ähnliches Problem und habe es ungefähr 3 Stunden lang durchgehackt, bevor ich eine Lösung fand. Ich würde Code schreiben, aber es ist zu Hause - ich kann es später tun, wenn jemand es braucht.

Hier sind einige Dinge, die Sie überprüfen sollten:

  • Legen Sie einen Haltepunkt für den Aufruf von SaveChanges () fest und untersuchen Sie den Objektkontext eingehend. Sie sollten eine Liste mit Ergänzungen und Änderungen am Kontext sehen. Als ich das erste Mal nachgesehen habe, habe ich festgestellt, dass es versucht hat, alle meine verwandten Objekte hinzuzufügen und nicht nur auf sie zu zeigen. In Ihrem Fall versucht der Kontext möglicherweise, einen neuen Report_Source_Type hinzuzufügen.
  • Bezieht sich auf den vorherigen Punkt. Wenn Sie jedoch die Berichtsquelle abrufen, müssen Sie sicherstellen, dass sie mit ihrem Entitätsschlüssel aus der Datenbank abgerufen und ordnungsgemäß an den Kontext angehängt wird. Wenn dies nicht der Fall ist, könnte der Kontext Ihrer Ansicht nach ein neues Element sein. Daher werden die erforderlichen Beziehungen nicht festgelegt.

Aus dem Arbeitsspeicher habe ich meine Referenzen mithilfe der context.GetObjectByKey Methode abgerufen und diese Objekte dann explizit mit der context.Attach Methode an den Kontext context.Attach , bevor sie den Eigenschaften meines ursprünglichen Objekts context.Attach .



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum