EntityException wurde beim Ausführen der EF6-Abfrage mit .Includes () ausgelöst

c# entity-framework entity-framework-6

Frage

Ich habe Probleme beim Migrieren einer EF4-Lösung zu EF6.

Wir verwenden T4-Vorlagen, um persistente, ignorante POCOs zu generieren, deren Navigationseigenschaften auf ObservableCollection <T> basieren.

Da unsere ObjectContext-Implementierung Entitätsgruppen als IObjectSet <entity> verfügbar macht, verlieren wir die Include () -Methode von ObjectQuery und müssen daher eine Erweiterungsmethode für IQueryable verwenden, um sie wie folgt wiederherzustellen:

public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
{
    IQueryable<TSource> returnValue = source;
    var objectQuery = source as ObjectQuery<TSource>;

    if (objectQuery != null)
    {
        returnValue = objectQuery.Include(path);
    }

    return returnValue;
}

Nachdem wir die Lösung für die Verwendung von EF6 aktualisiert haben, sehen wir nun die folgende System.Data.Entity.Core.EntityException beim Ausführen von Abfragen mit .Include (): -

"Die Navigationseigenschaft 'Details' für Entitäten vom Typ 'DataEntities.Parent' muss ICollection <T> implementieren, damit Entity Framework Änderungen in Sammlungen verfolgen kann."

Was ich nicht bekomme, ist die Eigenschaft 'Details' ist ein benutzerdefinierter Typ, der ObservableCollection <T> erbt, was eine ICollection <T> ist. Warum muss die Ausnahme, die dies angibt, ICollection <T> implementieren?

Wenn jemand etwas Licht auf dieses Thema wirft, wäre ich dankbar, danke.

Beliebte Antwort

Wie in diesem Blogbeitrag eines EF-Teammitglieds erläutert

Die Regeln, die Ihre Klassen befolgen müssen, um Änderungsverfolgungsproxys zu aktivieren, sind ziemlich streng und restriktiv. Dies begrenzt, wie Sie Ihre Entitäten definieren können und verhindert die Verwendung von Dingen wie private Eigenschaften oder sogar private Setter.

Die Regeln sind:

  • Die Klasse muss öffentlich und nicht versiegelt sein.
  • Alle Eigenschaften müssen über öffentliche / geschützte virtuelle Getter und Setter verfügen.
  • Navigationseigenschaften der Sammlung müssen als ICollection deklariert werden. Sie können nicht IList, List, HashSet usw. sein.

Und diese Antwort für eine Erklärung, warum Sie Ihre Implementierung nicht verwenden können.



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