ASP.NET MVC

Fluent API Relationships

Source: Mosh Hamedani

Trước tiên để dễ hình dung, thì ta có các mối quan hệ sau: Table1 và Table2

rightside

Nếu ta nhìn phía từ bên phải sang (Right side), thì ta có các thuộc tính sau:

  • HasMany() : nếu Table1 có quan hệ nhiều record với Table 2, thì thuộc tính đó là HasMany()
  • HasRequired(): nếu Table1 chỉ quan hệ 1 record với Table 2, thì thuộc tính đó là HasRequired()
  • HasOptional(): nếu Table1 có quan hệ 0 hoặc 1 record với Table2, thì thuộc tính đó là HasOptional()

Đó là mối quan hệ nhìn từ phải sang (Right side), còn mối quan hệ đảo chiều nghĩa là nhìn từ trái sang (left side) , thì ta có các thuộc tính sau:

leftside

  • WithMany() : nếu Table2 có quan hệ nhiều record với Table 1, thì thuộc tính đó là WithMany()
  • WithRequired(): nếu Table2 chỉ quan hệ 1 record với Table1, thì thuộc tính đó là WithRequired()
  • WithOptional(): nếu Table2 có quan hệ 0 hoặc 1 record với Table1, thì thuộc tính đó là WithOptional()

==> Hãy nhớ trọng tâm này, để ta cấu hình cho đúng khi dùng fluent api

relationship

==> những bài viết phía dưới, tôi sẽ dùng màu tím để chỉ rõ mối quan hệ right side, còn left side sẽ dùng màu xanh lá cây

1. One-to-Many

one-to-many

Hình trên chỉ rõ mối quan hệ như sau: Author có quan hệ nhiều record với Course, nhưng Course chỉ có quan hệ 1 record với Author.

modelBuilder.Entity<Author>()
  .HasMany(a => a.Courses)
  .WithRequired(c => c.Author)
  .HasForeignKey(c => c.AuthorId)

 

2. Many-to-Many

many-to-many

Hình trên chỉ rõ mối quan hệ many-to-many giữa 2 table CourseTag.

modelBuilder.Entity<Course>()
  .HasMany(c => c.Tags)
  .WithMany(t => t.Course)
  .Map(m => m.ToTable("MtM_CourseTags"))

==> Mặc định đối với quan hệ many-to-many, thì hệ thống sẽ tự động tạo ra table, để lưu trũ record cho mối quan hệ đó. Dĩ nhiên cái tên table có thể sẽ được đạt theo tự đông (bằng cách ghép 2 Class lại với nhau). Nhưng nếu bạn ko muốn nó lấy tên đó làm đó làm tên table, thì ta thêm đoạn code này vào, để nó lấy đúng hoặc map đúng tên table mà ta muốn đặt:

.Map(m => m.ToTable("MtM_CourseTags"))

3. One-to-Zero/One

one-to-zero-one

Hình trên chỉ rõ mối quan hệ one-to-zero/one giữa 2 table CourseCaption.

modelBuilder.Entity<Course>()
  .HasOptional(c => c.Caption)
  .WithRequired(t => t.Course)

3. One-to-One

One-to-one

Mối quan hê One-to-One không có trong Database, nhưng trong Entity Framework, nó cần cấu hình cho mối quan hệ này.
Trong mối quan hệ One-to-One, thì trước tiên phải cần xác định table nào là Principal , table nào là Dependent table. Đối với quan hệ One-to-One: ta phải bắt buộc insert record cho table A trước rồi sau đó mới insert record vào table B. ==> Lúc đó, table A chính là Principal , table B chính là Dependent.

Đây là đoạn code, nếu bạn cấu hình trên table Principal:

modelBuilder.Entity<Course>()
  .HasRequired(c => c.Cover)
  .WithRequiredPrincipal(c => t.Course)

 

Đây là đoạn code, nếu bạn cấu hình trên table Dependent:

modelBuilder.Entity<Cover>()
  .HasRequired(c => c.Course)
  .WithRequiredDependent(c => c.Cover)
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s