บทช่วยสอนนี้มุ่งหวังให้ง่ายและรวดเร็วเพราะฉันสังเกตเห็นปัญหา/ข้อสงสัยบนอินเทอร์เน็ตเกี่ยวกับความสัมพันธ์แบบกลุ่มต่อกลุ่ม ไม่มีอะไรดีไปกว่าตัวอย่างง่ายๆ

ความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่างสองเอนทิตีแสดงถึงความสัมพันธ์แบบหนึ่งต่อกลุ่มจากทั้งสองฝ่าย กล่าวคือ เอนทิตี การติดต่อและ ทักษะ

  • ผู้ติดต่อสามารถมีทักษะอย่างน้อยหนึ่งทักษะ
  • ทักษะสามารถปรากฏในผู้ติดต่อตั้งแต่หนึ่งรายขึ้นไป

นี่เป็นคำถามที่เรียบง่ายและเป็นพื้นฐานมากสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มของ Entity Framework Core

ลงมือเลย!

คุณสามารถค้นหาโซลูชันทั้งหมดได้จากพื้นที่เก็บข้อมูลของฉัน

สถานการณ์

ผู้ติดต่อสามารถมีทักษะตั้งแต่หนึ่งรายการขึ้นไป และทักษะสามารถเป็นของผู้ติดต่อหนึ่งรายการขึ้นไป นอกจากนี้ฉันอยากทราบระดับความเชี่ยวชาญที่แต่ละผู้ติดต่อมีในแต่ละทักษะ

ดังนั้นสำหรับสถานการณ์นี้ เราจำเป็นต้องมีเอนทิตีสามรายการ ได้แก่ การติดต่อ ทักษะและ ContactSkill

ฉันจำลองโดเมนดังนี้:

สิ่งสำคัญที่นี่คือเอนทิตี ContactSkill ใน Entity Framework Core 3.0 จำเป็นต้องรวมเอนทิตีในแบบจำลองเพื่อแสดงตารางการรวม Entity Framework Core 5.0 ไม่จำเป็นต้องมีตารางรวมนี้ แต่ในกรณีนี้ มีความจำเป็นเนื่องจากฉันต้องการทราบระดับความเชี่ยวชาญสำหรับแต่ละทักษะ

การสร้างโมเดล

หมายเหตุ เราไม่ต้องการรายชื่อผู้ติดต่อในเอนทิตีทักษะ เราเพียงแค่ต้องรู้ทักษะของการติดต่อแต่ละครั้ง สิ่งนี้แสดงใน modelBuilder ของเราด้วยวิธี WithMany หากคุณต้องการมีรายการในทักษะสำหรับผู้ติดต่อ คุณจะต้องดำเนินการดังนี้:

modelBuilder.Entity<ContactSkill>()
 .HasOne(x => x.Skill)
 .WithMany(x => x.Contacts)
 .HasForeignKey(x => x.SkillId);

มาทดสอบกัน

ตัวอย่างที่ 1:

ที่นี่เรากำลังสร้างทุกสิ่งพร้อมกัน การสร้างทักษะใหม่ การติดต่อใหม่ และจากนั้นสร้างการเชื่อมโยงระหว่างเอนทิตี

ตัวอย่างที่ 2:

ที่นี่เรากำลังสร้างทีละขั้นตอนและบันทึกลงในฐานข้อมูล สร้างทักษะและบันทึก จากนั้นจึงติดต่อและบันทึก และในตอนท้ายเท่านั้นที่เราจะสร้างความเชื่อมโยงระหว่างนั้น นี่เป็นเพียงการแสดงว่าเราไม่จำเป็นต้องทำทุกอย่างพร้อมกัน เราสามารถมีบางอย่างเช่นจุดสิ้นสุด API เพื่อสร้างทักษะและจุดสิ้นสุด API อื่นเพื่อสร้างผู้ติดต่อที่มีหรือไม่มีทักษะ หรือเพียงแค่เพิ่มทักษะเมื่อใดก็ตามที่เราต้องการ 😊

บทสรุป

หวังว่านี่จะช่วยให้ใครบางคนเข้าใจความสัมพันธ์แบบกลุ่มต่อกลุ่มได้ดีขึ้น ฉันขอแนะนำให้คุณตรวจสอบฐานข้อมูลหลังจากการโต้ตอบแต่ละครั้ง โซลูชันฉบับเต็มมีอยู่ในพื้นที่เก็บข้อมูลของฉัน