Entity Framework 4, วัตถุ POCO และ ASP.Net MVC2 ฉันมีความสัมพันธ์แบบหลายต่อหลายคนสมมติว่าระหว่างบล็อกโพสต์และเอนทิตีแท็ก ซึ่งหมายความว่าใน T4 ของฉันสร้างคลาส POCO BlogPost ฉันมี:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
ฉันขอ BlogPost และแท็กที่เกี่ยวข้องจากอินสแตนซ์ของ ObjectContext และส่งไปยังเลเยอร์อื่น (ดูในแอปพลิเคชัน MVC) ต่อมาฉันจะกลับ BlogPost ที่อัปเดตพร้อมคุณสมบัติที่เปลี่ยนแปลงและความสัมพันธ์ที่เปลี่ยนไป ตัวอย่างเช่นมีแท็ก "A" "B" และ "C" และแท็กใหม่คือ "C" และ "D" ในตัวอย่างเฉพาะของฉันไม่มีแท็กใหม่และคุณสมบัติของแท็กไม่เคยเปลี่ยนแปลงดังนั้นสิ่งเดียวที่ควรบันทึกคือความสัมพันธ์ที่เปลี่ยนแปลง ตอนนี้ฉันต้องการบันทึกสิ่งนี้ใน ObjectContext อื่น (อัปเดต: ตอนนี้ฉันพยายามทำในอินสแตนซ์บริบทเดียวกันและก็ล้มเหลวด้วย)
ปัญหา: ฉันไม่สามารถบันทึกความสัมพันธ์ได้อย่างเหมาะสม ฉันลองทุกอย่างที่พบ:
- Controller.UpdateModel และ Controller.TryUpdateModel ไม่ทำงาน
- การรับ BlogPost เก่าจากบริบทแล้วการแก้ไขคอลเลกชันไม่ทำงาน (ด้วยวิธีการที่แตกต่างจากจุดถัดไป)
- สิ่งนี้อาจใช้ได้ แต่ฉันหวังว่านี่เป็นเพียงวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหา :(
- พยายามแนบ / เพิ่ม / ChangeObjectState สำหรับ BlogPost และ / หรือแท็กในทุกชุดที่เป็นไปได้ ล้มเหลว
- นี้ดูเหมือนว่าสิ่งที่ฉันต้องการ แต่มันไม่ทำงาน (ผมพยายามที่จะแก้ไขได้ แต่ไม่สามารถแก้ไขปัญหาของฉัน)
- พยายาม ChangeState / เพิ่ม / แนบ / ... วัตถุความสัมพันธ์ของบริบท ล้มเหลว
"ไม่ทำงาน" หมายความว่าในกรณีส่วนใหญ่ฉันทำงานกับ "โซลูชัน" ที่กำหนดจนกว่าจะไม่มีข้อผิดพลาดและอย่างน้อยก็บันทึกคุณสมบัติของ BlogPost สิ่งที่เกิดขึ้นกับความสัมพันธ์จะแตกต่างกันไป: โดยปกติแท็กจะถูกเพิ่มอีกครั้งในตารางแท็กด้วย PK ใหม่และ BlogPost ที่บันทึกไว้จะอ้างอิงถึงสิ่งเหล่านั้นไม่ใช่ของดั้งเดิม แน่นอนว่าแท็กที่ส่งคืนมี PK และก่อนวิธีบันทึก / อัปเดตฉันจะตรวจสอบ PK และพวกเขาก็เท่ากับแท็กในฐานข้อมูลดังนั้น EF อาจคิดว่าเป็นวัตถุใหม่และ PK เหล่านั้นเป็น temp
ปัญหาที่ฉันทราบและอาจทำให้ไม่สามารถหาวิธีแก้ปัญหาอัตโนมัติแบบง่ายๆได้: เมื่อคอลเลกชันของวัตถุ POCO มีการเปลี่ยนแปลงสิ่งนั้นควรเกิดขึ้นจากคุณสมบัติคอลเลกชันเสมือนที่กล่าวถึงข้างต้นเพราะเคล็ดลับ FixupCollection จะอัปเดตการอ้างอิงย้อนกลับในอีกด้านหนึ่ง ของความสัมพันธ์แบบกลุ่มต่อกลุ่ม อย่างไรก็ตามเมื่อ View "ส่งคืน" อ็อบเจ็กต์ BlogPost ที่อัปเดตสิ่งนั้นจะไม่เกิดขึ้น ซึ่งหมายความว่าอาจจะไม่มีวิธีแก้ปัญหาง่ายๆ แต่นั่นอาจทำให้ฉันเสียใจมากและฉันก็เกลียดชัยชนะของ EF4-POCO-MVC :( นอกจากนี้ยังหมายความว่า EF ไม่สามารถทำสิ่งนี้ในสภาพแวดล้อม MVC ได้ ใช้ประเภทออบเจ็กต์ EF4 :( ฉันคิดว่าการติดตามการเปลี่ยนแปลงตามสแน็ปช็อตควรพบว่า BlogPost ที่เปลี่ยนแปลงมีความสัมพันธ์กับแท็กกับ PK ที่มีอยู่
Btw: ฉันคิดว่าปัญหาเดียวกันนี้เกิดขึ้นกับความสัมพันธ์แบบหนึ่งต่อหลายคน (Google และเพื่อนร่วมงานของฉันพูดอย่างนั้น) ฉันจะลองใช้ที่บ้าน แต่แม้ว่าจะได้ผล แต่ก็ไม่ได้ช่วยฉันในหกความสัมพันธ์แบบกลุ่มต่อกลุ่มในแอปของฉัน :(