เหตุใดฉันจึงได้รับข้อผิดพลาดนี้: ไม่มีการระบุการแมปสำหรับ EntitySet / AssociationSet - Entity1 ต่อไปนี้


97

ฉันใช้ Entity Framework 4 กับแนวทาง Model First

ฉันเริ่มโครงการออกแบบเอนทิตีและสร้างฐานข้อมูล ทุกอย่างทำงานได้ดี

จากนั้นฉันต้องกลับไปเพิ่มเอนทิตีอื่นในโมเดลของฉัน อย่างไรก็ตามเมื่อฉันลากเอนทิตีไปที่ EDMX ฉันได้รับข้อผิดพลาดนี้:

ป้อนคำอธิบายภาพที่นี่

ได้เลย! ฉันแค่ต้องแมป Entity1 กับตาราง .. แต่เดี๋ยวก่อน! ฉันใช้แนวทาง Model First ฉันคาดว่าจะสร้างตารางให้ฉันเมื่อฉันสร้าง DDL

ฉันจะแก้ไขข้อผิดพลาดนี้ได้อย่างไร


1
สามารถสร้างสคริปต์ฐานข้อมูลจากโมเดลของคุณได้หรือไม่?
Ladislav Mrnka

คำตอบ:


147

นี่เป็นเพราะวิธีการทำงานของ EF4 กับโมเดลแรก

เมื่อคุณสร้างโมเดลรุ่นแรกเป็นครั้งแรกจะอยู่ในสถานะที่ไม่มี SSDL คุณสามารถลากเอนทิตีเชื่อมโยงและอื่น ๆ ได้และหากคุณดู SSDL ในไฟล์ EDMX คุณจะเห็นว่าไม่มีเอนทิตีใดที่มีตารางพื้นที่เก็บข้อมูลที่เกี่ยวข้องใน SSDL

ซึ่งจะเปลี่ยนแปลงเมื่อคุณคลิกGenerate Database From Modelรายการเมนูบริบท ส่วนที่ทำให้สับสนคือการกระทำนี้ทำมากกว่าแค่การสร้างสคริปต์ DDL ในความเป็นจริงมันเปลี่ยนไฟล์ EDMX เพื่อรวมข้อมูล SSDL จากจุดนี้ไฟล์ EDMX จะเข้าสู่สถานะที่ทุกเอนทิตีในตัวออกแบบ / CSDL ต้องแมปกับเอนทิตีใน SSDL หากไม่มีการแมปจะทำให้เกิดข้อผิดพลาดเวลาคอมไพล์:

ไม่ได้ระบุการแมปสำหรับ EntitySet / AssociationSet ต่อไปนี้ - (EntityName)

ข้อเท็จจริงที่น่าสนใจอีกประการหนึ่งคือไม่ใช่ข้อผิดพลาดที่จะป้องกันการคอมไพล์ มันจะสร้างไลบรารีคลาสเอาต์พุต มันควรจะเตือนหรืออะไร?

เพื่อป้องกันข้อผิดพลาดนี้สิ่งที่คุณต้องทำหลังจากแทรกเอนทิตีใหม่คือการทำGenerate Database From Modelอีกครั้ง ซึ่งจะอัปเดต SSDL และแก้ไขการแมป

แก้ไข

หากคุณไม่ได้ใช้ model-first และคุณ "อัปเดตจากฐานข้อมูล" คุณจะมีข้อผิดพลาดนี้เช่นกันในกรณีที่คุณลบตารางใน DB Server เนื่องจาก Entity Framework จะไม่ลบเอนทิตีให้คุณโดยอัตโนมัติ ลบเอนทิตีด้วยตนเองและข้อผิดพลาดจะหายไป


1
ฉันพบปัญหาเดียวกันหลังจากอัปเดตโมเดลของฉันกับการเปลี่ยนแปลง bd (ซึ่งอาจไม่ดีเนื่องจากแนวทางของฉันไม่ใช่แบบจำลองก่อน)
balanza

5
@balanza เมื่อคุณไม่ได้ใช้โมเดลเป็นอันดับแรกและคุณอัปเดตโมเดลตามฐานข้อมูลคุณจะได้รับข้อผิดพลาดนี้เมื่อคุณลบตารางในเซิร์ฟเวอร์เนื่องจากตัวออกแบบ EF จะไม่ลบเอนทิตีโดยอัตโนมัติ เมื่อคุณลบประเภทเอนทิตีด้วยตนเองข้อผิดพลาดจะหายไป
André Pena

ฉันเปลี่ยนของฉันโดยตรงในไฟล์ xml ของโมเดลข้อมูลเอนทิตี ฉันมีตารางและฟังก์ชันมากมายและมีความเสี่ยงที่จะไม่ตรงกันดังนั้นฉันจึงทำด้วยตนเอง
Bat_Programmer

นี่เป็นประโยชน์อย่างยิ่ง นอกจากนี้หากคุณใช้ model-first และ "update from database" และได้รับตารางใหม่คุณก็จะพบข้อผิดพลาดเช่นกัน แต่การเรียกใช้ Generate Database จาก Model (ไม่จำเป็นต้องเรียกใช้สคริปต์ที่สร้างขึ้นจริง แต่มันจะฆ่าข้อมูลของคุณ!) จะแก้ไขปัญหาการทำแผนที่ในโค้ดของคุณและคุณจะไม่มีปัญหาในการใช้งานต่อไป
Brian Warshaw

1
คุณจะจัดการกับการอัปเดตสคีมาสำหรับฐานข้อมูล SQL Server CE ที่ปรับใช้แล้วได้อย่างไร สามารถย้ายคำถามนี้ไปเป็นคำถามแยกกันได้หากเป็นขั้นตอนที่ไม่เกี่ยวข้องทั้งหมด
FYK

35

ฉันพบว่าฉันได้รับข้อผิดพลาดเดียวกันเนื่องจากฉันลืมสร้างข้อ จำกัด ในการอ้างอิงหลังจากสร้างการเชื่อมโยงระหว่างสองเอนทิตี


13
FYI: ตรวจสอบคุณสมบัติของการเชื่อมโยงและด้านล่าง "ข้อ จำกัด การอ้างอิง" จะว่างเปล่า คลิกที่จุดไข่ปลาและสร้างข้อ จำกัด
Patrice Calvé

สิ่งนี้ช่วยฉันได้ ฉันต้องสร้างความสัมพันธ์แบบ 1 .. * จากเอนทิตีต้นทางของฉันไปยังเอนทิตีการนำทางของฉัน
duyn9uyen

21

ข้อผิดพลาด 3027: ไม่มีการแมปที่ระบุไว้สำหรับ EntitySet / AssociationSet ต่อไปนี้ ... "- อาการปวดหัวของ Entity Framework

หากคุณกำลังพัฒนาโมเดลด้วย Entities Framework คุณอาจพบข้อผิดพลาดที่น่ารำคาญในบางครั้ง:

ข้อผิดพลาด 3027: ไม่มีการแมปที่ระบุสำหรับ EntitySet / AssociationSet ต่อไปนี้ [ชื่อเอนทิตีหรือชื่อการเชื่อมโยง]

สิ่งนี้อาจไม่สมเหตุสมผลเมื่อทุกอย่างดูดีใน EDM แต่นั่นเป็นเพราะข้อผิดพลาดนี้ไม่เกี่ยวข้องกับ EDM โดยปกติ สิ่งที่ควรกล่าวคือ "สร้างไฟล์ฐานข้อมูลของคุณใหม่"

คุณจะเห็นว่าเอนทิตีตรวจสอบกับ SSDL และ MSL ในระหว่างการสร้างดังนั้นหากคุณเพิ่งเปลี่ยน EDM ของคุณ แต่ไม่ได้ใช้สร้างโมเดลฐานข้อมูล ...มันจะบ่นว่ามีสิ่งที่ขาดหายไปในสคริปต์ sql ของคุณ

ดังนั้นในระยะสั้นวิธีแก้ปัญหาคือ: "อย่าลืม สร้างแบบจำลองฐานข้อมูลทุกครั้งหลังจากที่คุณอัปเดต EDM ของคุณหากคุณกำลังทำการพัฒนาโมเดลครั้งแรกฉันหวังว่าปัญหาของคุณจะได้รับการแก้ไข"


สิ่งนี้ใช้ได้ผลกับข้อผิดพลาดเดียวกันนี้ในการสร้างโมเดลฐานข้อมูลช่วยล้างข้อยกเว้น
kolexinfos

7

ในกรณีของฉันนักพัฒนารายอื่นได้ลบตารางบางส่วนออกจากฐานข้อมูลพื้นฐาน เมื่อทราบสิ่งนี้และลบตารางเหล่านี้ออกจากเอนทิตีปัญหาก็จะได้รับการแก้ไข ไม่ชัดเจนเท่าที่มันฟัง


6

ฉันพบข้อผิดพลาดเดียวกัน แต่ฉันไม่ได้ใช้ model-first ปรากฎว่าไฟล์ EDMX ของฉันมีการอ้างอิงถึงตารางแม้ว่าจะไม่ปรากฏในตัวออกแบบก็ตาม ที่น่าสนใจคือเมื่อฉันค้นหาข้อความสำหรับชื่อตารางใน Visual Studio (2013) ไม่พบตาราง

เพื่อแก้ปัญหานี้ฉันใช้โปรแกรมแก้ไขภายนอก (Notepad ++) เพื่อค้นหาการอ้างอิงถึงตารางที่กระทำผิดในไฟล์ EDMX จากนั้น (อย่างระมัดระวัง) ลบการอ้างอิงทั้งหมดไปยังตาราง ฉันเสียใจที่ต้องบอกว่าฉันไม่รู้ว่าไฟล์ EDMX เข้าสู่สถานะนี้ได้อย่างไรในตอนแรก


5

ฉันมีการเปลี่ยนแปลงตารางและสร้างเอนทิตีอื่นโดยมีหมายเลข 1 ต่อท้าย (เช่นMyEntity1และ a MyEntity) ตามที่ได้รับการยืนยันจากเบราว์เซอร์รุ่น edmx บางอย่างเกี่ยวกับทั้งสองเอนทิตีเข้าด้วยกันทำให้การประมวลผลสับสน

การลบตารางและเพิ่มใหม่จะแก้ไขได้


โปรดทราบว่าหากเชื่อมต่อ TFS แล้วให้ทำการเช็คอินของ edmx ในภายหลังการลบ จากนั้นรับข้อมูลล่าสุดและเพิ่มอีกครั้งในกระบวนการสองขั้นตอนที่แน่นอน มิฉะนั้น TFS จะสับสนกับการลบและเพิ่มเอนทิตีชื่อเดียวกัน (ies) ซึ่งดูเหมือนจะทำให้เกิดปัญหา


ฉันมีปัญหาเดียวกันหลังจากเปลี่ยนตาราง ฉันพบเอนทิตีเดียวกันกับหมายเลข 1 และ 2 (MyEntity1, MyEntity2) ในหลาย ๆ ที่ภายใต้โมเดล ฉันดูในทุกสาขา (ไดอะแกรมประเภทเอนทิตี ฯลฯ ) และลบทุกอินสแตนซ์ของ MyEntity และ MyEntity [n] เพื่อการวัดที่ดีฉันได้ทำ "Clean Solution" แล้วอัปเดตจากฐานข้อมูลเพื่อเพิ่มเฉพาะ MyEntity อีกครั้ง
MsTapp

4

วิธีที่เร็วกว่าสำหรับฉันคือลบตารางและเพิ่มใหม่ มันแมปอัตโนมัติ :)


2

สำหรับผู้ที่ใช้Database Firstวิธีการทั้งหมดที่คุณต้องทำหลังจากแทรกเอนทิตีใหม่คือการGenerate Database From Modelคลิกขวาที่.edmxไฟล์ของคุณอีกครั้งและเลือกGenerate Database From Model...


0

มีข้อผิดพลาดนี้เมื่อฉันลบตารางออกจากฐานข้อมูล แก้ไขได้โดยคลิกขวาที่แผนภาพ EDMX ไปที่ Properties เลือกตารางจากรายการในหน้าต่าง Properties แล้วลบออก (โดยใช้ปุ่มลบ) จากไดอะแกรม


0
  1. ไปที่ Solution Explorer คลิกปุ่มค้นหา
  2. ปล่อยให้เลือกทั้งSearch within file contentและSearch External Files
  3. พิมพ์ชื่อเอนทิตีที่ไม่รู้จักการแมปของคุณ
  4. ลบไฟล์ทั้งหมดที่เกี่ยวข้องกับปัญหา สิ่งเหล่านี้อาจถูกตั้งชื่อตามเอนทิตีที่หายไปเดียวกัน อย่าลบไฟล์ใด ๆ ที่มีชื่อ Context Class ของคุณในไฟล์โดยเฉพาะอย่างยิ่งหากนามสกุลไฟล์เป็น. cs หรือ. tt ในไฟล์บริบท .cs
  5. ลบโค้ดทุกบรรทัดที่อ้างถึงเอนทิตีที่ขาดหายไป จะมีลักษณะดังนี้:

    public virtual DbSet< Entity1> Entity1 { get; set; }
    

ข้อผิดพลาดนี้มักเกิดขึ้นกับตารางที่ลบออกจากฐานข้อมูล

เมื่อใครวางตารางลงในฐานข้อมูลหรือเพียงแค่เปลี่ยนweb.config.connectionStringsสำหรับฐานข้อมูล EF Mapped เพื่อชี้ไปที่ใหม่และไม่ใช่ตารางที่ใช้สร้างการแมปดั้งเดิมคือปัญหา

เป็นฐานข้อมูลใหม่นี้เอนทิตีเหล่านี้โดยไม่มีข้อผิดพลาด 3027


0

ฉันมีข้อผิดพลาดขณะพยายามสร้างผลลัพธ์ที่กำหนดเองสำหรับขั้นตอนการจัดเก็บและคิดว่ามันต้องเป็นเอนทิตี

วิธีแก้ปัญหาคือฉันเพิ่งสร้างประเภทที่ซับซ้อนในเบราว์เซอร์ Model และกำหนดให้เป็น "แก้ไขการนำเข้าฟังก์ชัน"

ฉันจะเพิ่มที่นี่เนื่องจากดูเหมือนว่าคำถามนี้เป็นที่ที่ Google จะพาคุณไปเมื่อคุณได้รับข้อผิดพลาดนี้


0

ฉันตั้งค่าทุกอย่างถูกต้องแล้ว (คาร์ดินัลลิตีและคุณสมบัติที่อ้างอิง) แต่คิดไม่ออกว่าทำไมฉันถึงได้รับข้อผิดพลาด ในที่สุดก็พบว่า EF สร้างคอลัมน์ในตารางที่อ้างอิงขึ้นมาเอง (table_tablecolumn) และไม่มีความสัมพันธ์ใด ๆ กับตารางดังนั้นจึงไม่มีการระบุการแมป ฉันต้องลบคอลัมน์ในไฟล์ EDMX และสร้างโซลูชันใหม่ซึ่งแก้ไขปัญหาได้ ฉันใช้วิธี DB


0

อัปเดตโมเดลจากฐานข้อมูลไม่ได้ผลสำหรับฉัน

ฉันต้องลบเอนทิตีที่ขัดแย้งออกจากนั้นเรียกใช้ Update Model จากฐานข้อมูลสุดท้ายสร้างโซลูชันใหม่ หลังจากนั้นทุกอย่างก็ใช้ได้ดี


0

แบ่งปันสิ่งนี้ให้กับคนอื่น ๆ ในกรณีของฉันเรากำลังทำงานกับโซลูชัน MVC ที่ใช้ร่วมกันและใช้โมดูลทั่วไปสำหรับตารางที่เราใช้สำหรับดรอปดาวน์ ฉันได้รับข้อผิดพลาดเมื่อฉันอัปเดตโมเดลเอนทิตีโดยการเพิ่มตารางใหม่ ปรากฎว่าเมื่อฉันอัปเดต EDMX มันอาจจะอัปเดตสิทธิ์การเข้าถึงของฉันบนฐานข้อมูลซึ่งส่งผลให้ฉันไม่สามารถเข้าถึงตารางบางตารางno mapping specifiedนั้นได้

เพียงเพิ่มใหม่และให้สิทธิ์การเข้าถึงแก่ผู้ใช้ของฉันก็สามารถแก้ปัญหาได้


0

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

ไซต์กำลังทำงานกับตารางใหม่ แต่ฉันพบข้อผิดพลาด ในที่สุดฉันสังเกตเห็นตารางเดิมยังคงอยู่ในแบบจำลอง ฉันลบออกจากโมเดล (คลิกในหน้าจอ edmx ปุ่มลบ) จากนั้นข้อผิดพลาดก็หายไป

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