Comment travailler avec des collections

c# entity-framework entity-framework-core

Question

Quelqu'un peut-il écrire un mini-guide expliquant comment utiliser les collections dans EF?

Par exemple, j'ai les modèles suivants:

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; }
}

Et classe de contexte:

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);

    }
}

De quoi ai-je besoin pour écrire dans la méthode OnModelCreating afin de pouvoir utiliser Posts.Add, etc. partout dans mon code?

Réponse acceptée

Voici mes astuces pour utiliser les propriétés de navigation dans Entity Framework Core.

Astuce 1: Initialiser les collections

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; }        
}

Astuce 2: Construire en utilisant les HasOne et WithMany ou HasMany et WithOne

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

Astuce 3: chargez la collection avec impatience

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

Astuce 4: charger explicitement si vous n'avez pas hâte

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

Réponse populaire

Il semble que la propriété de navigation Comments ne fonctionne pas correctement. Essayez de fournir au modèle BlogPost le champ de référence réel dans la table PostComment . Renommez également la propriété de navigation dans PostComments pour la conformité de dénomination 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 cela ne fonctionne pas, vous devez définir manuellement votre relation, mais avant de vous aider, vous feriez mieux de fournir le schéma de ces deux tables dans votre base de données.

MISE À JOUR 01:

Premier conseil: vous utilisez des tables nommées au singulier. Ceci n'est pas conforme à la convention de dénomination EF. La pluralisation doit être désactivée. Il suffit de mettre cette ligne dans la méthode OnModelCreating .

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

Deuxième conseil: mon conseil précédent était totalement faux , ne le considérez plus , utilisez simplement votre ancien schéma de modèle. Maintenant, en supposant une relation un-à-plusieurs entre comment et post:

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);

}

Pour plus d'informations:

Tutoriel sur les relations un à plusieurs EF

Propriétés de relation et de navigation

Configuration des relations avec l'API Fluent



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi