EntityException iniciada ejecutando una consulta de EF6 con .Incluye ()

c# entity-framework entity-framework-6

Pregunta

Estoy teniendo problemas para migrar una solución EF4 a EF6.

Usamos plantillas T4 para generar POCO ignorantes persistentes que tienen propiedades de navegación basadas en ObservableCollection <T>.

Debido a que nuestra implementación de ObjectContext expone los conjuntos de entidades como IObjectSet <entidad> perdemos el método Include () de ObjectQuery y, por lo tanto, tenemos que usar un método de extensión en IQueryable para recuperarlo, de la siguiente manera:

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

Habiendo actualizado la solución para usar EF6, ahora vemos la siguiente excepción System.Data.Entity.Core.EntityException cuando se ejecutan consultas utilizando .Include (): -

"La propiedad de navegación 'Detalles' en la entidad de tipo 'DataEntities.Parent' debe implementar ICollection <T> para que Entity Framework pueda realizar un seguimiento de los cambios en las colecciones".

Lo que no entiendo es que la propiedad 'Detalles' es un tipo personalizado que hereda ObservableCollection <T> que es una ICollection <T>, ¿por qué la excepción que establece que debe implementar ICollection <T>?

Si alguien tiene alguna luz que arrojar sobre esto, estaría agradecido, gracias.

Respuesta popular

Como se explica en este blogpost de un miembro del equipo EF

Las reglas que deben seguir sus clases para habilitar los proxies de seguimiento de cambios son bastante estrictas y restrictivas. Esto limita la forma en que puede definir sus entidades y evita el uso de cosas como propiedades privadas o incluso establecedores privados.

Las reglas son:

  • La clase debe ser pública y no sellada.
  • Todas las propiedades deben tener captadores y configuradores virtuales públicos / protegidos.
  • Las propiedades de navegación de la colección se deben declarar como ICollection. No pueden ser IList, List, HashSet, etc.

Y esta respuesta para una explicación de por qué no puedes usar tu implementación.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué