Configure one-to-many và many-to-many trong EF Core

Chào mọi người,
Mình có bài toán cần phải thiết kế database có yêu cầu như sau:
One-to-many: một User có thể tạo nhiều Post
Many-to-many: một Post có thể có nhiều người được tag vào và một người có thể được tag trong nhiều post.

public class User
    {
        public int Id { get; set; }
        public string Username { get; set; }
        public List<Post> CreatedPosts{ get; set; }
        public List<PostTag> PostTags{ get; set; }
    }

public class Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public User CreatedMember { get; set; }
        public List<PostTag> ReminderMemberTags { get; set; }
    }

public class PostTag
    {
        public int ReminderId { get; set; }
        public Post Reminder { get; set; }
        public int MemberId { get; set; }
        public User Member { get; set; }
    }

Mình đã có thể cofigure riêng One-to-many và Many-to-many rồi nhưng thử kết hợp cả 2 lại như sau thì không update được database.

public class ApplicationDbContext : DbContext
    {
        public DbSet<User> Members { get; set; }

        public DbSet<Post> Reminders { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=localhost\SQLEXPRESS;Database=DbRelationshipDB;Trusted_Connection=True;MultipleActiveResultSets=true");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //Configure One-to-many
            modelBuilder.Entity<User>()
                .HasMany(m => m.CreatedReminders)
                .WithOne(r => r.CreatedMember)
                .IsRequired();

            //Configure many-to-many 
            modelBuilder.Entity<PostTag>()
                .HasKey(t => new { t.ReminderId, t.MemberId });

            modelBuilder.Entity<PostTag>()
                .HasOne(rmt => rmt.Reminder)
                .WithMany(a => a.ReminderMemberTags)
                .HasForeignKey(am => am.ReminderId);

            modelBuilder.Entity<PostTag>()
                .HasOne(rmt => rmt.Member)
                .WithMany(x => x.ReminderMemberTags)
                .HasForeignKey(am => am.MemberId);
        }
    }

Bài toán của mình khác với bài toán post-tag khác như sau.
Bài toán của mình :Một người có thể tạo nhiều post, và một post có thể tag nhiều người vào.
Bài toán khác: Một người có thể tạo nhiều post, và một post có thể tag nhiều tag vào.
Mong mọi người giúp đỡ configure hướng Code-first bằng Fluent API hoặc Data Annotation cũng được ạ.

Bạn thử chạy lệnh này xem
Add-migration <tên migration>
Update-Database

Ý mình là khi chạy lệnh update database thì bị lỗi do configure không đúng

Hi @pvnam95
Bạn đưa cái log bị lỗi lên để mọi người biết nha
Theo như mình đoán là do bạn đang config sai chỗ PostTag là set 2 column ReminderId và MemberId vừa là primary key vừa là foreign key nên bị lỗi

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?