Cómo trabajar con colecciones.

c# entity-framework entity-framework-core

Pregunta

¿Alguien puede escribir una mini guía que explique cómo trabajar con colecciones en EF?

Por ejemplo tengo los siguientes modelos:

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<PostComment> Comments { get; set; }
}

public class PostComment
{
    public int Id { get; set; }
    public BlogPost ParentPost { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
}

Y clase de contexto:

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
    public List<PostComment> Comments { get; set; }
}

public class PostComment
{
    public int Id { get; set; }
    public BlogPost ParentPost { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }
}

¿Qué necesito para escribir en el método OnModelCreating para poder usar Posts.Add y etc. en cualquier lugar de mi código?

Respuesta aceptada

Estos son mis consejos para trabajar con las propiedades de navegación en Entity Framework Core.

Consejo 1: Inicializar colecciones

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

Consejo 2: HasOne utilizando los HasOne y WithMany o HasMany y WithOne

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

Consejo 3: cargar con entusiasmo la colección

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

Consejo 4: Cargue explícitamente si no lo hizo ansiosamente

class Post
{
    public int Id { get; set; }

    // Initialize to prevent NullReferenceException
    public ICollection<Comment> Comments { get; } = new List<Comment>();
}

class Comment
{
    public int Id { get; set; }
    public string User { get; set; }

    public int PostId { get; set; }
    public Post Post { get; set; }        
}

Respuesta popular

Parece que la propiedad de navegación de Comments no funciona correctamente. Trate de proporcionar al modelo de BlogPost el campo de referencia real a la tabla PostComment . También cambie el nombre de la propiedad de navegación en PostComments para el cumplimiento de nomenclatura EF.

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

Si esto no funciona, tiene que definir manualmente su relación, pero antes de recibir ayuda, debería proporcionar el esquema de estas dos tablas en su db.

ACTUALIZACIÓN 01:

Primer consejo: estás utilizando tablas con nombres singulares. Esto no cumple con la convención de nomenclatura EF. La pluralización tiene que ser desactivada. Simplemente ponga esta línea en el método OnModelCreating .

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

Segundo consejo: mi consejo anterior fue totalmente incorrecto , no lo considere más , solo use el esquema de sus modelos anteriores. Ahora, asumiendo una relación de uno a varios entre el comentario y la publicación:

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateTime { get; set; }

    public int PosCommentId {get; set; }
    public List<PostComment> PostComments { get; set; }
}

Para más información:

Tutorial de relación uno a varios de EF

Propiedades de relación y navegación.

Configurando relaciones con la API Fluent




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é