Navigation properties null en Entity Framework

¡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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *