วิธีการสร้างข้อมูลด้วย 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.