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 PostContext : DbContext
{
    public DbSet<BlogPost> Posts { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Posts;Trusted_Connection=True;MultipleActiveResultSets=true");

    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

    }
}

¿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

protected override void OnModelCreating(ModelBuilder model)
{
    model.Entity<Post>()
        .HasMany(p => p.Comments).WithOne(c => c.Post)
        .HasForeignKey(c => c.PostId);
}

Consejo 3: cargar con entusiasmo la colección

var posts = db.Posts.Include(p => p.Comments);

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

db.Comments.Where(c => c.PostId == post.Id).Load();

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 .

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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:

protected override void OnModelCreating(ModelBuilder builder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<PostComment>().HasRequired<BlogPost>(c => c.ParentPost)
            .WithMany(p => p.Comments);

    base.OnModelCreating(builder);

}

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é