ประเภทหรือชื่อเนมสเปซ 'วัตถุ' ไม่มีอยู่ในเนมสเปซ 'System.Data'


102

ฉันใช้เอนทิตี C # และ SQL Server เพื่อสร้างแอป n-tier ฉันกำลังสร้างคลาสพื้นฐานที่ใช้ร่วมกันกับส่วนประกอบ DAL ทั้งหมดของฉัน ในคลาสฐานนี้ฉันต้องการจัดการสถานะการเชื่อมต่อของคลาสฐาน ObjectContext ที่สืบทอดมาโดยอ็อบเจ็กต์เอนทิตี

การคอมไพล์ทำให้เกิดข้อผิดพลาดต่อไปนี้:

ชนิดหรือชื่อเนมสเปซ 'ออบเจ็กต์' ไม่มีอยู่ในเนมสเปซ 'System.Data' (คุณไม่มีการอ้างอิงแอสเซมบลีหรือไม่)

นอกจากนี้คำสั่งใช้ System.Data.Objects ไม่สามารถแก้ไขได้ด้วยเหตุผลเดียวกัน

ฉันพยายามเพิ่มแอสเซมบลีเป็นข้อมูลอ้างอิง แต่ไม่พบในแท็บ. NET ของการอ้างอิงแอสเซมบลี

ความคิดใด ๆ ? ขอบคุณ!

คำตอบ:



52

หากคุณกำลังใช้ Entity Framework 6 ช่องว่างของชื่อจะเปลี่ยนไป คุณต้องการใช้

System.Data.Entity.Core.Objects.ObjectQuery

ฉันมี Entity Framework 6.1.3 ติดตั้งผ่านตัวจัดการแพ็คเกจ nuget ฉันไม่มี YET ที่อ้างถึง System.Data.Entity ของ Microsoft มันทำให้ฉันมีข้อผิดพลาด ดังนั้นคำถามของฉันคือฉันต้องอ้างอิง System.Data.Entity FIRST ก่อนที่จะเพิ่มโดยใช้คำสั่งหรือไม่
vibs2006

31

อัปเกรดจาก EF5 เป็น EF6 สักพักกลับมาเจอปัญหานี้ ฉันจะแก้ไขชั่วคราวโดยการอัปเดตโค้ดที่สร้างขึ้นเพื่ออ้างอิงSystem.Data.Entity.Core.Objectsแต่หลังจากสร้างแล้วจะมีการเปลี่ยนแปลงอีกครั้ง (ตามที่คาดไว้ตั้งแต่สร้างขึ้น)

สิ่งนี้ช่วยแก้ปัญหาได้ดี:

http://msdn.microsoft.com/en-us/data/upgradeef6

หากคุณมีโมเดลใด ๆ ที่สร้างด้วย EF Designer คุณจะต้องอัปเดตเทมเพลตการสร้างโค้ดเพื่อสร้างโค้ดที่เข้ากันได้กับ EF6 หมายเหตุ:ขณะนี้มีเทมเพลต EF 6.x DbContext Generator สำหรับ Visual Studio 2012 และ 2013 เท่านั้น

  1. ลบเทมเพลตการสร้างรหัสที่มีอยู่ โดยทั่วไปไฟล์เหล่านี้จะถูกตั้งชื่อว่า<edmx_file_name> .ttและ<edmx_file_name> .Context.ttและจะซ้อนกันภายใต้ไฟล์ edmx ของคุณใน Solution Explorer คุณสามารถเลือกเทมเพลตใน Solution Explorer และกดDelปุ่มเพื่อลบ
    หมายเหตุ:ในโครงการเว็บไซต์แม่แบบจะไม่ซ้อนกันภายใต้ไฟล์ edmx ของคุณ แต่จะแสดงอยู่ข้างใน Solution Explorer
    หมายเหตุ:ในโครงการ VB.NET คุณจะต้องเปิดใช้งาน 'แสดงไฟล์ทั้งหมด' เพื่อให้สามารถดูไฟล์เทมเพลตที่ซ้อนกันได้
  2. เพิ่มเทมเพลตการสร้างโค้ด EF 6.x ที่เหมาะสม เปิดแบบจำลองของคุณใน EF Designer คลิกขวาบนพื้นผิวการออกแบบแล้วเลือกเพิ่มรายการสร้างโค้ด ...
    • หากคุณใช้ DbContext API (แนะนำ) EF 6.x DbContext Generatorจะอยู่ใต้แท็บข้อมูล
      หมายเหตุ:หากคุณใช้ Visual Studio 2012 คุณจะต้องติดตั้ง EF 6 Tools เพื่อให้มีเทมเพลตนี้ ดูรายละเอียดในรับEntity Framework
    • หากคุณกำลังใช้ ObjectContext API แล้วคุณจะต้องเลือกออนไลน์แท็บและค้นหาEF 6.x EntityObject ปั่นไฟ
  3. หากคุณใช้การปรับแต่งใด ๆ กับเทมเพลตการสร้างโค้ดคุณจะต้องนำไปใช้ใหม่กับเทมเพลตที่อัปเดต

3

ปัญหาเดียวกันใน VS 2013

ฉันเพิ่มใน Web.config:

<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />

มันทำงานได้อย่างมีเสน่ห์

ฉันพบในหน้า: http://www.programmer.bz/Home/tabid/115/asp_net_sql/281/The-type-or-namespace-name-Objects-does-not-exist-in-the-namespace- SystemData.aspx



3

ในกรณีของฉันสำหรับ EF 6+ เมื่อใช้สิ่งนี้:

System.Data.Entity.Core.Objects.ObjectQuery

เป็นส่วนหนึ่งของคำสั่งนี้:

var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query).ToTraceString();

ฉันได้รับข้อผิดพลาดนี้:

Cannot cast 'query' (which has an actual type of 'System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>') to 'System.Data.Entity.Core.Objects.ObjectQuery'

ดังนั้นฉันจึงต้องใช้สิ่งนี้:

var sql = ((System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>)query).ToString();    

แน่นอนว่าลายเซ็นประเภทนิรนามของคุณอาจแตกต่างออกไป

HTH.


0

ฉันเพิ่มการอ้างอิงไปยังไฟล์. dll สำหรับ System.Data.Linq ข้างต้นไม่เพียงพอ คุณสามารถค้นหา. dll ในไดเร็กทอรีต่างๆสำหรับเวอร์ชันต่อไปนี้

System.Data.Linq C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Data.Linq.dll 3.5.0.0

System.Data.Linq C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ System.Data.Linq.dll 4.0.0.0


2
การแก้ไขนี้ตอบคำถามที่: ประเภทหรือชื่อเนมสเปซ 'Linq' ไม่มีอยู่ในเนมสเปซ 'System.Data'
Tom Cubbins

0

คุณต้องเพิ่มการอ้างอิงไปยังแอสเซมบลี. NET System.Data.Linq


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