¡Hola!
Hoy me encontré un problema con EF en el que algunas propiedades de navegación se quedan null estando marcadas como virtual. El caso era algo así (lo vamos a simplificar):
public class MultilingualString : Entity { public string DefaultText { get; set; } //ESTA ES LA PROPIEDAD QUE NOS INTERESA public virtual IList Translations { get; set; } } |
Donde Translation era:
public class Translation : Entity { protected Translation() { } public Translation(string text, Language language) { this.Text = text; this.Language = language; } public string Text { get; set; } //ESTA ES LA PROPIEDAD QUE NOS INTERESA public virtual Language Language { get; set; } } |
Y por último Language:
public class Language : Entity { private Language() { } public Language(string languageIdentifier) { this.LanguageIdentifier = languageIdentifier; } public string LanguageIdentifier { get; set; } } |
El problema era que, cuando obtenía la entidad MultilingualString la lista de Translations (que es virtual) se rellenaba correctamente, pero dentro de cada Translation la propiedad Language era null 🙁
Echando un vistazo, comprobé que la configuración del contexto era correcta (LazyLoadingEnabled=true y ProxyCreationEnabled=true), y las propiedades de navegación también (marcadas como virtual). Revisando la base de datos, también estaba bien creada y, por último, probé a hacer la carga de la propiedad explícita con Include. En este caso, añadiendo el Include sí cargaba bien la propiedad, luego sí o sí algo estaba haciendo mal.
El problema estaba en la clase Language. Si nos fijamos bien, tenemos un constructor con parámetros y otro sin parámetros (obligatorio para EF) marcado como privado y aquí estaba el problema, que es privado. Para acceder a los datos de la entidad el constructor tiene que ser protected o public.
public class Language : Entity { protected Language() { }//ASÍ FUNCIONA BIEN public Language(string languageIdentifier) { this.LanguageIdentifier = languageIdentifier; } public string LanguageIdentifier { get; set; } public bool IsThisLanguage(string language) { return this.LanguageIdentifier == language; } } |
Esto es el típico problema que por despiste ignorancia, te hace perder un buen rato 🙂
En este enlace podéis encontrar más información.
¡Saludos!