มี DefiningQuery แต่ไม่มีองค์ประกอบ InsertFunction … err


123

สิ่งนี้ทำให้ฉันแทบคลั่งและข้อผิดพลาดก็ไม่มีความหมายสำหรับฉัน:

ไม่สามารถอัปเดต EntitySet 'TableB' ได้เนื่องจากมี DefiningQuery และไม่มีองค์ประกอบอยู่ในองค์ประกอบเพื่อรองรับการดำเนินการปัจจุบัน

ตารางของฉันวางไว้ดังนี้:

TableA
int idA (เอกลักษณ์คีย์หลัก)
...

TableB
int idA (FK สำหรับ TableA.idA)
int val

TableB ไม่มีคีย์หลักที่กำหนดไว้ในเซิร์ฟเวอร์ SQL Entity Framework ได้นำเข้าตารางและการเชื่อมโยงและตั้งค่าฟิลด์ทั้งสองเป็นคีย์ แต่มันจะแสดงข้อผิดพลาดนั้นเมื่อฉันพยายามแทรกลงในตาราง!

เป็นอะไร ??


แก้ไข: ตามที่ Alex แนะนำวิธีแก้ปัญหาคือ:

  1. คลิกขวาที่ไฟล์ edmx เลือก Open with, XML editor
  2. ค้นหาเอนทิตีในองค์ประกอบ edmx: StorageModels
  3. ลบ DefiningQuery ทั้งหมด
  4. เปลี่ยนชื่อร้านค้า: Schema = "dbo" เป็น Schema = "dbo" (มิฉะนั้นรหัสจะสร้างข้อผิดพลาดว่าชื่อไม่ถูกต้อง)
  5. ลบร้านค้า: ชื่อคุณสมบัติ

ฉันปล่อยคีย์ไว้เหมือนเดิมเพราะฉันก็โอเคที่ทั้งสองคอลัมน์เป็นส่วนหนึ่งของคีย์


6
ขอบคุณสำหรับการอัปเดตคำแนะนำทีละขั้นตอนช่วยให้ EF newb นี้ทำให้แอปการสอน ASP.NET MVC ทำงานได้!
Adam Neal

ขอบคุณสำหรับสิ่งนี้! ฉันมีปัญหาที่ EF ไม่สร้างไฟล์ edmx ที่เหมาะสมสำหรับตาราง sql server 2000 ที่มีคีย์หลัก แต่คำสั่งนี้ช่วยฉันได้ :)
100r

4
3.5 ปีต่อมาและโพสต์นี้ยังคงช่วยคนในกรณีนี้ ME! ... ถึง: Palantir สำหรับคำอธิบายทีละขั้นตอน (ได้ผล) และขอบคุณ Alex >>> Bravo!
nanonerd

วิธีแก้ปัญหาได้ผลสำหรับฉันขอบคุณ
Delavega

ความลับนี้กำลังลบ "store:" ออกจากคำจำกัดความของสคีมา ดีมาก
Guilherme Ferreira

คำตอบ:


141

เมื่อพบตารางที่ไม่มี PrimaryKey จะถือว่าเป็น View

และมุมมองปรากฏในไฟล์ EDMX (เปิดในตัวแก้ไข XML เพื่อดู) ในองค์ประกอบ StorageModel \ EntitySet [n] \ DefiningQuery

เมื่อคุณมี DefiningQuery เอนทิตีจะกลายเป็นแบบอ่านอย่างเดียวเว้นแต่คุณจะเพิ่มฟังก์ชันการปรับเปลี่ยน คุณต้องมีฟังก์ชันการปรับเปลี่ยน 3 ฟังก์ชัน (หรือที่เรียกว่า Stored Procedures) หนึ่งฟังก์ชันสำหรับการแทรกอัปเดตและลบ

แต่คุณมีสองทางเลือก:

เปลี่ยนการกำหนดคีย์:

  1. และโน้มน้าว EF ว่าสิ่งที่คิดว่าเป็นมุมมองนั้นเป็นตารางจริงๆ
  2. หรือเพิ่มฟังก์ชันการปรับเปลี่ยนที่เหมาะสม

ในกรณีของคุณฉันแนะนำ (1)


ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามเพิ่มเอนทิตีในตารางทางแยก ข้อเสนอแนะของคุณได้รับการแก้ไขแล้วขอบคุณ!
Walter Stabosz

มันยอดเยี่ยมมาก ... , Tnks
Mohan Gundlapalli

อย่าลืมคลิกที่ "อัปเดตโมเดลจากฐานข้อมูล" บนไฟล์. edmx ที่คุณสร้างจากฐานข้อมูลก่อน
Bashar Abu Shamaa

ฉันประสบปัญหาเดียวกันส่วนที่แปลกคือมันทำงานได้ดีในสภาพแวดล้อมในพื้นที่และการทดสอบของเรามันไม่ได้ผลกับสภาพแวดล้อมของลูกค้า (น่าเบื่อ)
Mox Shah

13

เพียงแค่เพิ่มคีย์หลักลงในตาราง แค่นั้นแหละ. แก้ไขปัญหา.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

6

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


5

เพิ่มคีย์หลักในตารางลบโมเดลจากโมเดล edmx จากนั้นเลือกอัปเดตจากฐานข้อมูลสร้างและรัน ...... ใช้งานได้


1

@Palantir ตรวจสอบว่าทั้งสองตารางของคุณมีการตั้งค่าคีย์หลักและระวังด้วยคีย์หลักหลายชุดในตาราง


0
  1. คุณต้องเปิดไฟล์. EDMX ด้วยตนเองใน notepad หรือ notepad ++ หรือในโปรแกรมแก้ไขข้อความที่คุณเลือก
  2. ค้นหารายการใน edmx: StorageModels ในไฟล์ที่เปิดในขั้นตอนที่ 1
  3. ค้นหาองค์ประกอบ DefiningQuery และลบแท็กนี้ทั้งหมด
  4. ค้นหาร้านค้า: Schema = "dbo" ถึง Schema = "dbo" (หากคุณข้ามขั้นตอนนี้จะทำให้เกิดข้อผิดพลาดของชื่อไม่ถูกต้อง)
  5. บันทึกและปิดไฟล์

หวังว่ามันจะแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.