ef core code first one to many code example

Example 1: ef core many-to-many

class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    {
    }

    public DbSet<Post> Posts { get; set; }
    public DbSet<Tag> Tags { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasMany(p => p.Tags)
            .WithMany(p => p.Posts)
            .UsingEntity<PostTag>(
                j => j
                    .HasOne(pt => pt.Tag)
                    .WithMany(t => t.PostTags)
                    .HasForeignKey(pt => pt.TagId),
                j => j
                    .HasOne(pt => pt.Post)
                    .WithMany(p => p.PostTags)
                    .HasForeignKey(pt => pt.PostId),
                j =>
                {
                    j.Property(pt => pt.PublicationDate).HasDefaultValueSql("CURRENT_TIMESTAMP");
                    j.HasKey(t => new { t.PostId, t.TagId });
                });
    }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public ICollection<Tag> Tags { get; set; }
    public List<PostTag> PostTags { get; set; }
}

public class Tag
{
    public string TagId { get; set; }

    public ICollection<Post> Posts { get; set; }
    public List<PostTag> PostTags { get; set; }
}

public class PostTag
{
    public DateTime PublicationDate { get; set; }

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

    public string TagId { get; set; }
    public Tag Tag { get; set; }
}

Example 2: many to many ef core

// Relationship format for traditional Many to Many (You have to use Many to Many with Data annotations for additional variables on the join table)

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace EFGetStarted
{
    public class Context : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite(@"Data Source=blogging.db");

        protected override void OnModelCreating(ModelBuilder modelBuilder) { }
    
        public DbSet<GarageDoorModel> GarageDoorModels { get; set; }
        public DbSet<Section> Sections { get; set; }
    }

    public class GarageDoorModel
    {
        public int GarageDoorModelId { get; set; }
        public string ModelName { get; set; }
        
        public ICollection<Section> Sections { get; set; }
    }

    public class Section
    {
        public int SectionId { get; set; }
        public string SectionName { get; set; }
        public string Key { get; set; }
        
        public ICollection<GarageDoorModel> GarageDoorModels { get; set; }
    }
}

//Using the Data

using System;
using System.Collections.Generic;
using System.Linq;
using EFGetStarted;

namespace SchoolCourse
{
    internal class Program
    {
        private static void Main()
        {
            using var db = new Context();
            
            Console.WriteLine("Inserting new records");

            var modelName = "X";
            
            var sections = new List<Section> {
                new Section
                {
                    SectionName = "Engine",
                    Key = "front_engine"
                },
            };

            db.Add(new GarageDoorModel {ModelName = modelName});
            db.SaveChanges();

            var gdm = db.GarageDoorModels.First(g => g.ModelName == modelName);
            gdm.Sections = sections;

            db.SaveChanges();

            // Read
            var new_gdm = db.GarageDoorModels.First(g => g.ModelName == modelName);
            Console.WriteLine(new_gdm.Sections);
            
            foreach (var VARIABLE in new_gdm.Sections)
            {
                Console.WriteLine(VARIABLE.Key);
            }
            
        }
    }
}

//package list

Project 'SchoolCourse' has the following package references
   [net5.0]:
   Top-level Package                              Requested   Resolved
   > Microsoft.EntityFrameworkCore.Design         5.0.5       5.0.5
   > Microsoft.EntityFrameworkCore.Sqlite         5.0.5       5.0.5
   > Microsoft.EntityFrameworkCore.SqlServer      5.0.5       5.0.5