Soy bastante nuevo en el ASP .NET MVC mundo. Tal vez, esa es la razón que no puedo explicar a mí mismo la causa de lo que es, para mí, un problema molesto.

Tengo una clase con Uno-A-Muchos relashionship.

class MyClass{
    public List<OtherClass> otherClasses {get;set;}
}

Cuando estoy persistencia de una instancia de esta clase, me llene de su relación con una Lista vacía<>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);

El problema es que, cuando intento recuperar esa instancia y por cualquier razón, yo intente acceder a esa lista, el sistema me da una Excepción de Referencia Nula…

Mi pregunta es: ¿por qué no EF devuelven listas en lugar de null queridos? Especialmente en este caso, que soy persistente con una lista vacía?

Hay alguna manera de evitar verificando si las instancias son nulos?

  • ¿cuál es el marco de entidades de clase?
InformationsquelleAutor igor.araujo | 2012-02-12

3 Comentarios

  1. 27

    Usted debe tener su entidad crear las listas en el constructor. EF no crear dependiente de las colecciones, y espera que la entidad a hacerlo.

    Así, a su caso, usted podría hacer su entidad como esta:

    class MyClass{ 
        public List<OtherClass> _otherClasses {get;set;} 
    
        public MyClass() {
            _otherClasses = new List<OtherClass>();
        }
    } 
    • Esto sin duda soluciona mi problema! Gracias por su ayuda! Así que la EF llamadas constructor del objeto antes de cargar con la persistió la info, no es así?
    • No, EF «no llame» el constructor. C#. Cuando un objeto es creado, el constructor es llamado. Incluso cuando EF se materializa objetos de la db.
    • Lo consiguió! Gracias!
    • tienes toda la razón, pero el punto es que a veces esta llamada al constructor es de algún modo evitar! Por ejemplo, en WCF binario deserialización
    • no estamos hablando de WCF, estamos hablando de la EF, y el constructor no está en bypass. No sé lo suficiente acerca de WCF a comentar sobre eso.
    • Sí, tienes toda la razón, las dos veces. Yo sólo quería hacer el punto de que el hecho de que C# llama al constructor, no significa que siempre se llama.
    • Si el constructor no se llama en WCF, es porque WCF es probable que no newing el objeto, pero utilizando otro mecanismo que la materializan. La serialización es un proceso complejo y a menudo se hacen las cosas en un nivel bajo para lograrlo.
    • No puedo encontrar ninguna EF documentación relacionada diciendo «EF espera que la entidad crea dependientes de las colecciones».
    • Sí, bueno, EF no está bien documentado en todas las áreas. Sin embargo, puedes ver más aquí: stackoverflow.com/questions/20757594/… – Si la colección está cargado ligeramente diferente

  2. 16

    Hacer el otherClasses colección virtual. Esto permitirá a la EF a la carga perezosa la colección.

    class MyClass{
        public virtual List<OtherClass> otherClasses {get;set;}
    }

    De lo contrario usar con ganas de cargar con Include método.

    context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
    • De hecho, la carga diferida resuelve mi problema… Pero estoy tratando de evitar la carga diferida porque me estaba dando la Circular de Referencia de la Serialización de Error cuando yo estaba usando peticiones JSON. De todos modos, me alegro por tu ayuda. Gracias!
    • Para problemas de referencia circular, puede utilizar atributos como JsonIgnore para evitar un back-vinculación de la propiedad de navegación de la serialización.
  3. 0

    Por lo tanto, si entiendo correctamente, usted está agregando un vacío List<OtherClass> para el contexto y, a continuación, tratando de recuperar.

    Supongo que usted tiene que pensar acerca de cómo el contexto realizará el seguimiento y consulta de entidades que se encuentran en su contexto. Esto se hace generalmente por la Key de la entidad. En tu ejemplo, usted no ha dado a la entidad un Key, por lo tanto, el contexto no tiene manejar en la entidad.

    Por lo tanto, cuando se consulta, el contexto no encontrar un objeto y devuelve null.

    Si desea inicializar una nueva entidad, que yo recomendaría a dar por lo menos un Key (generalmente el Id de la propiedad) y, a continuación, seleccione por clave cuando de búsqueda más tarde.

    Espero que esto ayude.

    • De hecho, mi verdadero clases tienen todos un atributo ID. Era sólo un ejemplo en el que se me olvidó incluir el ID :P. de todos Modos, gracias por tu respuesta!

Dejar respuesta

Please enter your comment!
Please enter your name here