วิธีการสร้างข้อมูลด้วย AddOrUpdate ด้วยคีย์ที่ซับซ้อนใน EF 4.3


101

ฉันกำลังพยายามสร้างฐานข้อมูลการพัฒนาด้วยข้อมูลการทดสอบบางส่วน

ฉันได้ใช้context.People.AddOrUpdate(p => p.Id, people));กับความสำเร็จมาก

ฉันมีตารางอื่นที่ฉันต้องเริ่มต้นซึ่งฉันไม่รู้ว่าคีย์หลัก

ตัวอย่างเช่นฉันต้องการ AddOrUpdate ตามชื่อและนามสกุลที่ตรงกัน

ฉันไม่แน่ใจว่าจะเขียนนิพจน์อย่างไรให้ถูกต้อง

context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);

เห็นได้ชัดว่าไม่ถูกต้อง แต่ฉันหวังว่ามันจะบ่งบอกถึงวิธีแก้ปัญหาที่ฉันกำลังมองหา

คำตอบ:


200

ลองสิ่งนี้:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);

12
@LadislavMrnka จะเกิดอะไรขึ้นถ้าตัวระบุต้องเป็นประเภทที่ซับซ้อนเช่น context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
— gabe

3
@LadislavMrnka เช่นกันจะเกิดอะไรขึ้นถ้าคุณสมบัติเป็นประเภทว่างเปล่า? คือ context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
— stack247

2
สิ่งที่ควรทราบก็คือคอลเล็กชัน "บุคคล" ต้องเป็น ARRAY ไม่ใช่รายการ หากคุณมีรายชื่อเอนทิตีคุณสามารถเรียก. ToArray () ในรายการได้ ฉันต่อสู้กับสิ่งนั้น :) - คำตอบที่ดี
— Dean Martin

1
ไม่สามารถใช้งานได้ อาจเป็นเพราะ (นอกเหนือจากคุณสมบัติ 3 รายการที่ระบุในคีย์ผสม) ฉันมีฟิลด์ ID อื่นที่มีหมายเลขที่สร้างขึ้นโดยอัตโนมัติ
— Sonic Soul

@LadislavMrnka จำเป็นต้องเก็บโฟลเดอร์ Migration (Configuration.cs และ ... ) หลังจากทำการย้ายข้อมูลและอัปเดตฟิลด์ฐานข้อมูล ???
— AminM

1

หากคุณได้รับOnly primitive types or enumeration types are supported in this context.เนื่องจากการใช้คุณสมบัติการนำทางให้พิจารณาเพิ่มคุณสมบัติคีย์ต่างประเทศโดยตรงไปยังเอนทิตี (อาจมีเฉพาะ getter) และใช้ตามที่Ladislav Mrnkaเสนอ


จะเพิ่มคุณสมบัติการนำทางของคีย์ต่างประเทศของตารางอื่นในcode firstวิธีการได้อย่างไร? ฉันมีโครงสร้างเช่นcontext.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? มันเป็นไปได้
— yogen darji

ถ้าฉันตั้งข้อผิดพลาดคุณสมบัติ getter คือThe specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
— yogen darji
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.