EntityException lanciata eseguendo la query EF6 con .Includes ()

c# entity-framework entity-framework-6

Domanda

Ho difficoltà a migrare una soluzione EF4 in EF6.

Utilizziamo i modelli T4 per generare POCO ignoranti persistenti che hanno proprietà di navigazione basate su ObservableCollection <T>.

Poiché la nostra implementazione ObjectContext espone i set di entità come IObjectSet <entity> perdiamo il metodo Include () da ObjectQuery e quindi dobbiamo utilizzare un metodo di estensione su IQueryable per recuperarlo, come segue:

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;
}

Dopo aver aggiornato la soluzione per utilizzare EF6, ora vediamo il seguente System.Data.Entity.Core.EntityException quando si eseguono query usando .Include (): -

"La proprietà di navigazione" Dettagli "sull'entità di tipo" DataEntities.Parent "deve implementare ICollection <T> affinché Entity Framework sia in grado di tracciare le modifiche nelle raccolte."

Quello che non ottengo è la proprietà 'Dettagli' è un tipo personalizzato che eredita ObservableCollection <T> che è un ICollection <T>, quindi perché l'eccezione che afferma che deve implementare ICollection <T>?

Se qualcuno ha qualche luce da spargere su questo sarei grato, grazie.

Risposta popolare

Come spiegato in questo blogpost di un membro del team EF

Le regole che le classi devono seguire per abilitare i proxy di rilevamento delle modifiche sono piuttosto rigide e restrittive. Questo limita il modo in cui puoi definire le tue entità e impedisce l'uso di cose come proprietà private o anche setter privati.

Le regole sono:

  • La classe deve essere pubblica e non sigillata.
  • Tutte le proprietà devono avere getter e setter virtuali pubblici / protetti.
  • Le proprietà di navigazione della raccolta devono essere dichiarate come ICollection. Non possono essere IList, List, HashSet e così via.

E questa risposta per una spiegazione del perché non puoi usare la tua implementazione.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché