Asked May 11th, 5:45 AM 36 0 0
  • 36 0 0
+1

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

Share
  • 36 0 0

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 ạ.