บทช่วยสอนนี้มุ่งหวังให้ง่ายและรวดเร็วเพราะฉันสังเกตเห็นปัญหา/ข้อสงสัยบนอินเทอร์เน็ตเกี่ยวกับความสัมพันธ์แบบกลุ่มต่อกลุ่ม ไม่มีอะไรดีไปกว่าตัวอย่างง่ายๆ
ความสัมพันธ์แบบกลุ่มต่อกลุ่มระหว่างสองเอนทิตีแสดงถึงความสัมพันธ์แบบหนึ่งต่อกลุ่มจากทั้งสองฝ่าย กล่าวคือ เอนทิตี การติดต่อและ ทักษะ
- ผู้ติดต่อสามารถมีทักษะอย่างน้อยหนึ่งทักษะ
- ทักษะสามารถปรากฏในผู้ติดต่อตั้งแต่หนึ่งรายขึ้นไป
นี่เป็นคำถามที่เรียบง่ายและเป็นพื้นฐานมากสำหรับความสัมพันธ์แบบกลุ่มต่อกลุ่มของ 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 อื่นเพื่อสร้างผู้ติดต่อที่มีหรือไม่มีทักษะ หรือเพียงแค่เพิ่มทักษะเมื่อใดก็ตามที่เราต้องการ 😊
บทสรุป
หวังว่านี่จะช่วยให้ใครบางคนเข้าใจความสัมพันธ์แบบกลุ่มต่อกลุ่มได้ดีขึ้น ฉันขอแนะนำให้คุณตรวจสอบฐานข้อมูลหลังจากการโต้ตอบแต่ละครั้ง โซลูชันฉบับเต็มมีอยู่ในพื้นที่เก็บข้อมูลของฉัน