ไม่พบผู้ให้บริการ Entity Framework สำหรับผู้ให้บริการ ADO.NET ที่มีชื่อไม่เปลี่ยนแปลง 'System.Data.SqlClient'


542

หลังจากดาวน์โหลด EF6 โดย nuget แล้วลองเรียกใช้โครงการของฉันมันจะส่งคืนข้อผิดพลาดต่อไปนี้:

ไม่พบผู้ให้บริการ Entity Framework สำหรับผู้ให้บริการ ADO.NET ที่มีชื่อไม่เปลี่ยนแปลง 'System.Data.SqlClient' ตรวจสอบให้แน่ใจว่าผู้ให้บริการลงทะเบียนในส่วน 'เอนทิตีเฟรมเวิร์ค' ของไฟล์กำหนดค่าแอปพลิเคชัน ดูhttp://go.microsoft.com/fwlink/?LinkId=260882สำหรับข้อมูลเพิ่มเติม

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


ฉันใช้ EF5 โดยไม่ต้องมีของprovidersและproviderอื่น ๆ ลองพิจารณานำออกไหม
ta.speot.is

1
ใส่สำเนาสตริงการเชื่อมต่อของคุณที่นี่
pylover

สตริงการเชื่อมต่ออยู่ในรูปภาพ (App.confing) โดยวิธีง่ายมากฉันเรียกตัวสร้างpublic BaseStorage(): base ("RaptorDB") {}, BaseStorage () สืบทอดมาจาก DbContext ใน EF5 ทุกอย่างทำงานได้อย่างสมบูรณ์ไม่ได้อยู่ใน EF6
Fernando Vellozo

10
ปัญหาจะได้รับการแก้ไขโดยการติดตั้ง EF6 โครงการที่สอง (คอนโซล) ขอบคุณทุกคนที่ช่วยด้วยวิธีใด ๆ !
Fernando Vellozo

3
สำหรับฉันนี้ดูเหมือนจะเกิดจาก Visual Studio ไม่ทราบว่า EntityFramework.SqlServer ประกอบจริง ๆ แล้วถูกใช้โดยโครงการพื้นฐาน หากคุณทำอะไรเช่นคำตอบของ @ Carraคุณไม่ต้องเพิ่ม EF ในแต่ละโครงการที่อ้างอิงโครงการพื้นฐานของคุณ - สะอาดกว่ามาก
tehDorf

คำตอบ:


608

ฉันเพิ่งเจอปัญหาเดียวกันและดูเหมือนว่า EntityFramework แม้ว่าติดตั้งจาก NuGet Package Manager ติดตั้งไม่ถูกต้องในโครงการ

ฉันจัดการเพื่อแก้ไขได้โดยรันคำสั่งต่อไปนี้บนPackage Manager Console :

PM> Install-Package EntityFramework

34
PMC เขียนว่า 'EntityFramework 6.0.1' ติดตั้งไว้แล้ว แต่เพิ่มลงในแอพคอนโซลของฉัน (ซึ่งไม่ได้ใช้ EF จริง ๆ ) แต่มันก็เป็นเคล็ดลับสำหรับฉันเช่นกัน II ลบ EF ออกจากการอ้างอิงแอปคอนโซลการคืนความผิดพลาดฉันไม่ได้รับ - แอพคอนโซลของฉันใช้โครงการพื้นที่เก็บข้อมูล (ซึ่งใช้ EF) ขอบคุณสำหรับความช่วยเหลือ!
Prokurors

33
อย่าลืมเพิ่ม -ProjectName <ProjectName> ในบรรทัดคำสั่งหากคุณมีหลายโครงการในโซลูชันของคุณ ... !!!
Eugenio Miró

1
การใช้-Preตัวเลือก tell nuget เพื่อติดตั้งแพ็คเกจก่อนวางจำหน่าย ฉันไม่แนะนำให้ใช้ ฉันมีข้อผิดพลาดคล้ายกัน แต่วิธีแก้ไขคือเพียงติดตั้ง EntityFramework ในโครงการโฮสต์ ฉันได้ติดตั้งไว้ในห้องสมุดชั้นเรียน แต่ไม่ได้อยู่ในโครงการหลัก (เว็บ / คอนโซล / หรืออะไรก็ตาม)
Davide Icardi

10
ปัญหาเดียวกันที่นี่ ฉันมีโครงการที่ไม่มีการอ้างอิงถึง EF แต่ EF dll อยู่ในโฟลเดอร์ดีบั๊ก เรียกใช้คำสั่งนี้กับโครงการนี้เพิ่มEntityFramework.SqlServer.dllในโฟลเดอร์ดีบั๊ก - แก้ไขปัญหาแล้ว
qujck

4
ในสถานการณ์ของฉันข้อผิดพลาดนี้ไม่ได้แสดงตัวจนกว่าฉันจะปรับใช้โครงการบนเซิร์ฟเวอร์ทดสอบของเรา อันที่จริงมันเป็น EntityFramework.SqlServer.dll ที่ขาดหายไปและติดตั้ง EF ผ่านผู้จัดการแพคเกจทำงาน มันเพิ่งเพิ่มการอ้างอิงที่เกี่ยวข้องสองโครงการและเพิ่มการตั้งค่า entityFramework ใน web.config ฉันเดาว่า IIS ในตัวเครื่องนั้นสามารถประกอบภายในเครื่อง แต่ IIS เต็มบนเว็บเซิร์ฟเวอร์ไม่สามารถทำได้เนื่องจากการอนุญาต
Atters

384

คุณได้เพิ่ม EF ลงในโครงการห้องสมุดชั้นเรียน คุณต้องเพิ่มลงในโครงการที่อ้างอิง (แอปคอนโซลเว็บไซต์หรืออะไรก็ตาม)


247
นี่เป็นคำตอบที่ไร้สาระอย่างแน่นอน ทำไมบนโลกนี้ฉันต้องทำอย่างนั้น? และคุณรู้ไหมว่าไร้สาระยิ่งกว่าอะไร? มันได้ผล.
Robert

19
ดูคำตอบของฉันด้านล่างคุณไม่จำเป็นต้องติดตั้ง EF ในแอปพลิเคชันคอนโซลของคุณ
Francisco Goldenstein

7
คำตอบของคุณถูกต้อง เพิ่มการอ้างอิง EntityFramework.SqlServer.dll ไปยังส่วนหน้าของโครงการที่ใช้ไลบรารีกับ EF เท่านั้นแก้ไขปัญหา ดังนั้นอย่าใช้ EF นี้ (เฉพาะ DLL)
harveyt

31
คุณไม่จำเป็นต้องเพิ่มการอ้างอิงถึง EF ในคอนโซล / เว็บแอป คุณเพียงแค่ต้องแน่ใจว่าEntityFramework.SqlServer.dllกำลังคัดลอกไปยังไดเรกทอรีถัง การเพิ่มการอ้างอิงที่แข็งแกร่งอาจทำให้สถาปัตยกรรมของคุณเสียหาย (หากคุณสร้างหลายระดับชุดประกอบการเรียกใช้งานระดับบนสุดของคุณไม่ควรรู้เกี่ยวกับ EF) แต่คุณสามารถมั่นใจได้ว่าผู้ให้บริการเซิร์ฟเวอร์ SQL ถูกคัดลอก ดูตัวอย่างstackoverflow.com/a/19130718/870604
ken2k

3
ฉันสงสัยว่าเหตุผลที่ EntityFramework.SqlServer.dll ไม่ได้รับการตรวจพบว่าเป็นการขึ้นต่อกันเนื่องจาก Entity Framework โหลดแบบไดนามิก โครงการของคุณควรรู้ที่จะคัดลอกไปยังผู้ให้บริการ SQL อย่างไรเมื่อมีการอ้างอิงเพียงอย่างเดียวในไฟล์ปรับแต่ง
Joel McBeth

209

คุณไม่จำเป็นต้องติดตั้ง Entity Framework ในแอปพลิเคชันคอนโซลของคุณคุณเพียงแค่ต้องเพิ่มการอ้างอิงไปยังแอสเซมบลี EntityFramework.SqlServer.dll คุณสามารถคัดลอกแอสเซมบลีนี้จากโครงการไลบรารีคลาสที่ใช้ Entity Framework ไปยังโฟลเดอร์ LIB และเพิ่มการอ้างอิง

สรุป:

  • แอปพลิเคชันไลบรารีคลาส:
    • ติดตั้ง Entity Framework
    • เขียนโค้ดเลเยอร์ข้อมูลของคุณ
    • ไฟล์ app.config มีการกำหนดค่าทั้งหมดที่เกี่ยวข้องกับ Entity Framework ยกเว้นสตริงการเชื่อมต่อ
  • สร้างแอปพลิเคชันคอนโซลเว็บหรือเดสก์ท็อป:
    • เพิ่มการอ้างอิงถึงโครงการแรก
    • เพิ่มการอ้างอิงถึง EntityFramework.SqlServer.dll
    • app.config / web.config มีสตริงการเชื่อมต่อ (โปรดจำไว้ว่าชื่อของรายการการกำหนดค่าจะต้องเหมือนกับชื่อของคลาส DbContext

ฉันหวังว่ามันจะช่วย


18
คำตอบที่ถูกต้อง ไม่จำเป็นต้องติดตั้ง EF EntityFramework.SqlServer.dll
Tom Stickel

15
ฉันต้องยอมรับ นี่คือคำตอบที่ถูกต้องอย่างสมบูรณ์ อ้างอิง dll ที่เป็น 1/2 mb หรือดึงโครงการ EF nuget ที่> 5.5 mb ลดค่าใช้จ่ายของการออกแบบสถาปัตยกรรมหลายชั้นด้วยเช่นกัน การแสดงที่แย่จาก MS จริง ๆ : ฉันมี 4 ชั้นและชั้นบนสุดของฉันไม่ควรมีเหตุผลอะไรที่จะรู้อะไรเกี่ยวกับ EF
72GM

18
ยังคงไร้สาระอยู่ดี เช่นทำไมส่วนหน้าจะต้องมีการอ้างอิงถึง SqlServer? ปลายด้านหน้าไม่สนใจอะไรน้อยในกรณีของฉัน แต่มันได้ผล +1
Mike de Klerk

2
สิ่งนี้มีประโยชน์ ขอบคุณมาก.
peter_the_oak

1
สิ่งนี้จะทำให้การอัปเดต EntityFramework เวอร์ชั่นยากขึ้นหรือไม่ คุณต้องจำไว้ว่าให้ไปและอัปเดตข้อมูลอ้างอิงไปยัง DLL
สนใจใน

114

คุณยังสามารถเห็นข้อความนี้หากคุณลืมที่จะรวม "EntityFramework.SqlServer.dll"

ดูเหมือนว่าจะเป็นไฟล์ที่เพิ่มเข้ามาใหม่ใน EF6 ตอนแรกฉันไม่ได้รวมไว้ในโมดูลผสานและพบปัญหาตามรายการที่นี่


7
ฉันพบปัญหานี้เมื่อก่อนหน้านี้ฉันมีโครงการ (a) ที่มีการอ้างอิงถึงโครงการ (b) ซึ่งมีการอ้างอิงถึง EF หลังจากล้างและลบโปรเจ็กต์ (a) โฟลเดอร์ bin แล้วสร้างใหม่การอ้างอิง EF เข้ามา แต่ไม่ใช่ EF.SqlServer.dll การคัดลอกในที่ทำงานด้วยตนเองสำหรับฉัน
dan richardson

2
@dan richardson ขอบคุณที่กล่าวถึง 'โฟลเดอร์ถังขยะ'
Rajshekar Reddy

ฉันได้รับข้อผิดพลาดเมื่อพยายามเรียกใช้สคริปต์ LINQPad หลังจากการอัพเกรด EF6 แม้การอ้างอิง EntityFramework.SqlServer.dll ใน LINQPad ไม่สามารถแก้ไขได้จนกว่าฉันจะสร้างโซลูชันขึ้นมาใหม่ใน VS2013 การอ้างอิงใหม่นั้นได้รับการแก้ไขอย่างถูกต้องใน LINQPad และสคริปต์ของฉันทำงาน!
คริส

ในกรณีของฉันฉันก็โอเคที่สภาพแวดล้อม dev แต่เมื่อฉันเผยแพร่ปรากฏปัญหาการอ้างอิง หลังจากเปรียบเทียบรายการของไลบรารีใน dev กับโฟลเดอร์ bin ในเซิร์ฟเวอร์ฉันสังเกตเห็นว่าไม่มี EntityFramework.SqlServer.dll ฉันเพิ่งจะอัปโหลดและรีเฟรชแอปและ voila แก้ไข
Henry Rodriguez

นี่เป็นปัญหาสำหรับฉันขอบคุณ! ดูโซลูชันที่สะอาดโดย @Anders เพื่อหลีกเลี่ยงปัญหาที่ลืมรวม DLL ในทุกโครงการที่จำเป็น
SharpC

54

แทนที่จะเพิ่ม EntityFramework.SqlServer ไปยังโฮสต์โครงการคุณสามารถมั่นใจได้ถึงการอ้างอิงแบบคงที่จากโครงการ Model / entity ของคุณเช่นนี้

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

ซึ่งจะทำให้กระบวนการสร้างรวมแอสเซมบลีกับโครงการโฮสต์

ข้อมูลเพิ่มเติมเกี่ยวกับบล็อกของฉัน http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/


5
ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ดีที่เราไม่จำเป็นต้องรวมการอ้างอิงถึง DLLs ที่เกี่ยวข้องกับการคงอยู่ในโครงการที่ควรจะเป็นผู้ไม่เชื่อเรื่องพระเจ้า
JTech

3
เห็นด้วยและมันใช้กับห้องสมุดใด ๆ ที่มีการพึ่งพาโดยนัยไม่เพียง แต่คงอยู่
Anders

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

2
หากไม่มีมันจะไม่มีการพึ่งพาอย่างชัดเจนกับแอสเซมบลีจากรหัสของคุณและมันจะไม่ถูกคัดลอกไปยังผลลัพธ์
Anders

2
อันนี้ยอดเยี่ยม
กริช

48

เมื่อคุณติดตั้ง Entity Framework Nugetถึงที่ EntityFramework.SqlServer บางครั้งอาจพลาดการปฏิบัติการอื่น เพียงเพิ่มNugetแพ็คเกจลงในโครงการนั้น

บางครั้งด้านบนใช้ไม่ได้กับโครงการทดสอบ

เพื่อแก้ปัญหานี้ในโครงการทดสอบเพียงแค่วางวิธีนี้ในโครงการทดสอบ:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

วิธีการนี้ไม่เคยถูกเรียกใช้ แต่เป็นข้อสังเกตของฉันคอมไพเลอร์จะลบชุดประกอบที่ "ไม่จำเป็น" ทั้งหมดและไม่ใช้EntityFramework.SqlServerสิ่งที่การทดสอบล้มเหลว


2
นี่ไม่สวย แต่แก้ไขปัญหาที่ฉันมีในโครงการทดสอบของฉัน ไม่มีวิธีแก้ปัญหาอื่นที่ใช้งานได้
Chow เกียรติ

ในกรณีของฉันมันก็เพียงพอที่จะเพิ่ม Entity Framework ไปยังโครงการทดสอบของฉันใน "จัดการแพ็คเก็ต Nuget สำหรับการแก้ปัญหา"
Juha Palomäki

ที่จริงคุณต้องใส่ในโครงการใด ๆ (ไม่เพียงทดสอบ) เพื่อประกันว่า System.Data.Entity.SqlServer จะรวมอยู่ใน "ชุดผลลัพธ์ lib" หลังจากรวบรวม (หมายเหตุ: ความสามัคคีหรือเครื่องมือ IoC อื่น ๆ สามารถเปลี่ยนกฎนี้และคุณจะ ต้องเรียกรหัสนี้จากโครงการทดสอบ)
Roman Pokrovskij

นี่เป็นทางออกที่ดีที่สุดเพราะคุณไม่จำเป็นต้องอ้างถึงเฟรมเวิร์กเอนทิตีทุกที่ในโครงการของคุณ
Daniel Lobo

สิ่งนี้ชี้ให้ฉันไปในทิศทางที่ถูกต้อง EntityFramework.SqlServerถูกเพิ่มเข้าไปในห้องสมุดชั้นของคุณ แต่ถ้าไม่ได้ใช้ก็จะไม่ถูกวางไว้ในโฟลเดอร์การส่งออกของแอพลิเคชันของคุณ ฉันแก้ไขปัญหาด้วยการเพิ่มสิ่งExecutionStrategyที่ฉันยังต้องทำดังนั้นการเพิ่มบรรทัดSetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());ภายในDbConfigurationชั้นเรียนช่วยแก้ไขปัญหาได้
Jan_V

24

เพิ่มฟังก์ชั่นนี้

private void FixEfProviderServicesProblem()

ไปยังคลาสบริบทฐานข้อมูลในคลาสไลบรารีและ DLL EntityFramework.SqlServer.dll ที่หายไปจะถูกคัดลอกไปยังตำแหน่งที่ถูกต้อง

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}

.


ขอโทษที่พยายามเพิกถอนมัน ... เพราะฉันไม่คิดว่ามันจะทำงานได้ ... และมันก็เป็นเช่นนั้น ... มันบอกว่าฉันไม่สามารถเปลี่ยนการลงคะแนนของฉันได้เว้นแต่ว่าคำตอบจะได้รับการแก้ไข cozs มันยาวเกินไปและนับ แต่นั้นมา ถูกล็อค ...
Seabizkit

มันก็ใช้ได้กับฉันเช่นกัน เรามีโครงการห้องสมุดที่ใช้ EF 6 และแอปพลิเคชันคอนโซลที่ใช้ห้องสมุด เราได้รับข้อยกเว้นเช่นเดียวกับ OP เราไม่ต้องการวางการกำหนดค่าเฉพาะของ EntityFramework ในไฟล์การกำหนดค่าแอปพลิเคชันดังนั้นวิธีนี้ใช้ได้ผลสำหรับเรา ขอบคุณ
Rob

1
คุณโทรหาFixEfProviderServicesProblemฉันได้ลองที่ไหนในคอนสตรัคเตอร์โดยไม่มีโชค
ฟรานซิส Ducharme

1
ฉันไม่เคยเรียกมันว่า - ไม่จำเป็นต้อง ความจริงที่ว่ามีทำให้. net คิดว่ามันจำเป็นและรวมถึง EntityFramwork เป็นการพึ่งพา
โยฮันเนส

อาจมาจากstackoverflow.com/a/19130718/1467396หรือไม่ แต่ +1 อย่างไรก็ตามสำหรับความชัดเจนในวิธี / สถานที่ที่จะใช้
David

20

สิ่งเหล่านี้ไม่เหมาะกับฉัน ฉันหาวิธีแก้ปัญหาในสแต็คโอเวอร์โฟลว์คำถามอื่น ฉันจะเพิ่มที่นี่เพื่อการอ้างอิงที่ง่าย:

คุณต้องทำการอ้างอิงดังนั้นมันจะถูกคัดลอกในพา ธ ของแอปพลิเคชัน den เพราะในภายหลังจะมีการอ้างอิงในรันไทม์ ดังนั้นคุณไม่จำเป็นต้องคัดลอกไฟล์ใด ๆ

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

2
นี้! ไม่จำเป็นต้องเพิ่มการอ้างอิงไปยังโครงการอื่น ๆ ที่อาจอ้างอิงแอสเซมบลีนี้
tehDorf

8

ฉันได้รับข้อผิดพลาดเดียวกันในขณะที่ใช้ Entity Framework 6 กับ SQL Server Compact 4.0 บทความเกี่ยวกับ MSDN สำหรับEntity Framework Providersสำหรับ EF6 มีประโยชน์ การเรียกใช้คำสั่งของผู้ให้บริการที่เกี่ยวข้องเป็นแพคเกจ nuget ที่ Package Manager Console อาจแก้ปัญหาได้เช่นกันเนื่องจากแพ็คเกจ NuGet จะเพิ่มการลงทะเบียนไปยังไฟล์ปรับแต่งโดยอัตโนมัติ ฉันวิ่งPM> Install-Package EntityFramework.SqlServerCompactไปแก้ปัญหา


2
ฉันประหลาดใจจริงๆที่ไม่มีใครโหวตให้กับเรื่องนี้! ข้อความแสดงข้อผิดพลาดระบุไว้อย่างชัดเจน: สาเหตุของข้อผิดพลาดคือหลังจากการอัพเกรด EF ไม่มีคำจำกัดความของผู้ให้บริการเหลืออยู่สำหรับ SQL Compact ในไฟล์ web.config ของแอปพลิเคชัน! การเพิ่มแพ็คเกจที่คุณพูดถึงแก้ไขไฟล์ web.config และจะมีการกำหนดผู้ให้บริการ
Csaba Toth

1
เพียงช่วยชีวิต ควรทำเครื่องหมายว่าเป็นคำตอบเนื่องจากให้วิธีการแก้ปัญหาอย่างชัดเจน
ZafarYousafi

7

พบปัญหานี้วันนี้เมื่อทำงานกับชุดบริการเว็บแต่ละโครงการในโครงการที่ต่างกันและโครงการแยกต่างหากที่มีการทดสอบการรวมสำหรับบริการเหล่านั้น

ฉันใช้การตั้งค่านี้มาระยะหนึ่งกับ EF5 โดยไม่จำเป็นต้องรวมการอ้างอิงถึง EF จากโครงการทดสอบการรวม

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

สิ่งบ่งชี้ที่คุณกำลังเผชิญกับปัญหาเดียวกัน:

  • โทรไปยัง EF โดยตรง (การเชื่อมต่อกับฐานข้อมูลการรับข้อมูลและอื่น ๆ ) ทำงานได้ดีตราบใดที่มีการริเริ่มจากโครงการที่มีการอ้างอิงถึง EF6
  • การโทรไปยังบริการผ่านอินเทอร์เฟซบริการที่เผยแพร่นั้นใช้ได้ดี; เช่นไม่มีการอ้างอิงที่ขาดหายไป "ภายใน" ในบริการ
  • การโทรโดยตรงไปยังวิธีการสาธารณะในโครงการบริการจากโครงการที่อยู่นอกบริการจะทำให้เกิดข้อผิดพลาดนี้แม้ว่าจะไม่ได้ใช้ EF ในโครงการนั้น ภายในเท่านั้นในโครงการที่เรียก

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


7

เมื่อข้อผิดพลาดเกิดขึ้นในโครงการทดสอบทางออกที่สวยที่สุดคือการตกแต่งคลาสทดสอบด้วย:

[DeploymentItem("EntityFramework.SqlServer.dll")]

มันค่อนข้างสวย แต่สร้างงานได้มากกว่าและง่ายกว่าที่จะลืม ด้วยเคล็ดลับ "การอ้างอิงแบบบังคับ" คุณจะต้องทำในโครงการที่จำเป็นต้องใช้ภาษา EF เท่านั้น
Charles Roberto Canato

7

โครงการเริ่มต้นที่อ้างอิงโครงการที่มีการใช้ Entity Framework ต้องการแอสเซมบลีที่สองต่อไปนี้ในโฟลเดอร์ช่องเก็บของ:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll

เพิ่ม<section>ไป<configSections>ของไฟล์ .config ในโครงการเริ่มต้นที่ทำให้เป็นครั้งแรกที่มีการชุมนุมในไดเรกทอรี bin ว่า คุณสามารถคัดลอกสิ่งนี้ได้จากไฟล์. config ของโครงการ Entity Framework ของคุณ:

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

เมื่อต้องการทำให้. dll ที่สองพร้อมใช้งานในโฟลเดอร์ช่องเก็บแม้ว่าจะไม่สามารถใช้งานได้ แต่ก็สามารถทำสำเนาด้วยตนเองจากโฟลเดอร์ช่องเก็บของโครงการ Entity Framework ได้ ทางเลือกที่ดีกว่าคือการเพิ่มลงในกิจกรรมสร้างโครงร่างของเอนทิตีเฟรมเวิร์กในบรรทัดต่อไปนี้ซึ่งจะทำให้กระบวนการอัตโนมัติ:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

2
ขอบคุณฉันมี Entity framework ใน data layer ดังนั้นมันจึงแยกได้ แต่น่าเสียดายที่ microsoft ไม่ยอมให้เราแยกชั้นข้อมูลอย่างแท้จริงและทำให้เราสร้างมลภาวะ ux ด้วยเทคโนโลยีฐานข้อมูล ฉันหวังว่าฉันคงไม่ต้องทำอย่างนั้น
Matt

4

ฉันเพิ่งพบปัญหานี้ในวันนี้ ฉันมีไลบรารีคลาสของที่เก็บข้อมูลพร้อมแพ็กเกจ EF63 NuGet และแอปพลิเคชันคอนโซลสำหรับการทดสอบซึ่งมีการอ้างอิงกับโครงการไลบรารีคลาสเท่านั้น ฉันสร้างคำสั่ง post-build ที่ง่ายมากซึ่งคัดลอก EntityFramework.SqlServer.dll จากโฟลเดอร์ Bin \ Debug ของไลบรารีคลาสไปยังโฟลเดอร์ Bin \ Debug ของแอปพลิเคชันและแก้ไขปัญหา อย่าลืมเพิ่มส่วน entityFramework เพื่อคอนโซลไฟล์. config ของแอปพลิเคชัน


4

เพิ่มด้านล่างลงในแอปของคุณกำหนดค่า

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

นอกจากนี้คุณยังจะต้องลงทะเบียนไปยัง<configSections>-<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
TryingToImprove

นี่คือสิ่งที่ "IInstall-Package EntityFramework" ทำ สิ่งนี้ไม่จำเป็นจริงๆเพราะ EntityFramework โดยค่าเริ่มต้นพยายามโหลด EntityFramework.SqlServer.dll สำหรับชื่อที่ไม่แปรเปลี่ยนของ SqlClient วิธีนี้สามารถใช้แทนผู้ให้บริการ
user1295211


3

คุณควรบังคับให้มีการอ้างอิงแบบคงที่กับแอสเซมบลีEntityFramework.SqlServer.dllแต่แทนที่จะใส่รหัสดัมมี่คุณสามารถทำได้ด้วยวิธีที่สวยงามกว่านี้:

  1. หากคุณมีคลาสDbConfigurationอยู่แล้ว:

    public class MyConfiguration : DbConfiguration
    {
        public MyConfiguration()
        {
            this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        }
    }
  2. หากคุณไม่มีคลาสDbConfigurationคุณต้องใส่รหัสต่อไปนี้เมื่อเริ่มต้นแอพ (ก่อนที่จะใช้ EF):

    static MyContext()
    {
        DbConfiguration.Loaded += (sender, e) =>
            e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);
    }

2

ฉันเพิ่งติดตั้ง Entity Framework อีกครั้งโดยใช้ Nuget และปฏิบัติตามคำแนะนำที่เขียนไว้ในลิงค์ด้านล่าง: http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

ฉันคิดว่าปัญหาจะได้รับการแก้ไข


คำอธิบายจะดี! ทำไมคุณต้องติดตั้งใหม่อีกครั้ง
Rizier123

1
เนื่องจากเหตุผลที่ไม่ทราบสาเหตุการเปลี่ยนแปลงจะไม่มีผลดังนั้นฉันจึงติดตั้ง EntityFramework 6.1.1 อีกครั้งและหลังจากนั้นจะมีผล
Kuntal Ghosh

2

ขยายไฟล์ YourModel.edmx และเปิดคลาส YourModel.Context.cs ภายใต้ YourModel.Context.tt

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

ใช้ SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

คุณอาจต้องเพิ่มบรรทัดนี้ในไฟล์ทุกครั้งที่ไฟล์ถูกสร้างขึ้นโดยอัตโนมัติ


2

ฉันยังมีปัญหาที่คล้ายกันปัญหาของฉันได้รับการแก้ไขโดยทำสิ่งต่อไปนี้:

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

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


2

ดูเหมือนว่าไม่มีใครพูดถึงก่อนตรวจสอบว่ามีการติดตั้ง System.Data.SqlClient ในระบบและหากมีการอ้างอิง

ฉันแก้ไขปัญหาของฉันโดยการติดตั้ง System.Data.SqlClient และเพิ่มผู้ให้บริการใหม่ในแอป

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

1

นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณเริ่มโครงการเป็นโครงการที่มี dbcontext ของคุณ (หรือ app.config ที่เกี่ยวข้อง) ฉันพยายามที่จะเริ่มโครงการเว็บไซต์ที่ไม่มีการตั้งค่าที่จำเป็นทั้งหมด


1

ฉันลองเกือบทั้งหมดแล้วไม่มีอะไรทำงาน

เมื่อฉันตั้งค่า DLLs ที่อ้างอิงในโครงการเริ่มต้นEntityFrameworkและEntityFramework.SqlServerคุณสมบัติCopy Localเพื่อให้Trueมันเริ่มทำงานได้!


1

ทุกคนฉันต้องการความสนใจของคุณว่าสอง dll EntityFramework.dll และ EntityFramework.SqlServer.dll เป็น DataAccess layer Library และไม่ใช่ Logical ที่จะใช้พวกเขาในมุมมองหรือ layer.it อื่น ๆ แก้ปัญหาของคุณ แต่มันไม่ใช่ตรรกะ

วิธีตรรกะคือคุณลักษณะ enitiess ลบและแทนที่ด้วย Fluent API.this เป็นทางออกที่แท้จริง


1

ฉันมีหนึ่งคอนโซลแอปพลิเคชันและคลาสไลบรารี ในไลบรารีคลาสฉันสร้างโมเดลข้อมูลเอนทิตี (คลิกขวาที่ไลบรารีคลาส> เพิ่ม> รายการใหม่> ข้อมูล> โมเดลข้อมูลเอ็นติตี้ ADO.NET 6.0) และใส่การอ้างอิงภายในแอปพลิเคชันคอนโซล ดังนั้นคุณมีแอปพลิเคชั่นคอนโซลที่อ้างอิงถึงไลบรารีคลาสและในไลบรารีคลาสที่คุณมีโมเดล EF ฉันมีข้อผิดพลาดแบบเดียวกันเมื่อฉันพยายามรับระเบียนจากตาราง

ฉันแก้ไขปัญหานี้โดยทำตามขั้นตอนเหล่านี้:

  1. คลิกขวาเพื่อแก้ปัญหาและเลือกตัวเลือก 'จัดการแพคเกจ NuGet สำหรับโซลูชัน' และหน้าต่างตัวจัดการแพคเกจของ NuGet จะปรากฏขึ้น
  2. ไปที่ตัวเลือก 'จัดการ' ภายใต้ 'แพคเกจที่ติดตั้ง' เคล็ดลับ: Entity Framework ถูกเพิ่มเข้าไปใน Class Library ดังนั้นคุณจะมี EntityFramework ภายใต้ 'แพ็คเกจที่ติดตั้ง' และคุณจะเห็น 'จัดการ' ตัวเลือก
  3. คลิกที่ตัวเลือก 'จัดการ' และตรวจสอบการติดตั้งแพคเกจไปยังโครงการที่มีการอ้างอิงถึงห้องสมุดชั้นเรียนที่มีรูปแบบ EF (ในกรณีของฉันฉันตั้งกล่องกาเครื่องหมายเพื่อติดตั้งแพคเกจไปยังแอพคอนโซลซึ่งมีการอ้างอิง

นั่นคือทั้งหมดที่ฉันต้องทำและทุกอย่างทำงานได้อย่างสมบูรณ์แบบ

ฉันหวังว่ามันจะช่วย


1

ฉันมีข้อผิดพลาดเดียวกัน มันแปลกที่มันจะเกิดขึ้นเฉพาะเมื่อใดก็ตามที่ฉันใช้ dbContext ของฉันเพื่อสอบถามโมเดลของฉันหรือรับรายการดังนี้:

var results = _dbContext.MyModel.ToList();

เราพยายามติดตั้ง Entity Framework อีกครั้งอ้างอิงอย่างถูกต้อง แต่ไม่มีประโยชน์

โชคดีที่เราพยายามตรวจสอบ Nuget เพื่อหาALLวิธีแก้ไขแล้วอัปเดตทุกอย่างหรือตรวจสอบให้แน่ใจeverythingเป็นรุ่นเดียวกันเพราะเราสังเกตว่าโครงการสองโครงการนั้นมีรุ่น EF ที่แตกต่างกันในโครงการเว็บ และมันใช้งานได้ ข้อผิดพลาดหายไป

นี่คือภาพหน้าจอเกี่ยวกับวิธีการจัดการ Nuget สำหรับโซลูชันทั้งหมด:

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


1

คุณขาดการอ้างอิงไปที่ EntityFramework.SqlServer.dll สำหรับโครงการ EntityFramework ที่ใช้ SQL Server สองไฟล์ที่คุณต้องอ้างอิงคือ EntityFramework.SqlServer.dll และ EntityFramework.dll


0

ฉันมีปัญหาที่เกี่ยวข้องเมื่อทำการย้ายจากฐานข้อมูล CE ไปยัง SQL Server บน Azure เพิ่งเสียเวลา 4 ชั่วโมงพยายามแก้ปัญหานี้ หวังว่านี่อาจช่วยคนที่โชคชะตาที่คล้ายกัน สำหรับฉันฉันมีการอ้างอิงถึง SqlCE ในไฟล์ packages.config ของฉัน การลบมันแก้ไขปัญหาทั้งหมดของฉันและอนุญาตให้ฉันใช้การย้ายข้อมูล Yay Microsoft สำหรับเทคโนโลยีอื่นที่มีปัญหาการตั้งค่าและการตั้งค่าที่ซับซ้อนโดยไม่จำเป็น



0

ฉันมีข้อยกเว้นที่เหมือนกันโยน ฉันรวม

using System.Data; 
using System.Data.Entity;

และทุกอย่างกลับมาทำงานได้อีกครั้ง ..


0

เป็นข้อความแสดงให้เห็นว่าเราจำเป็นต้องเพิ่มผู้ให้บริการ System.Data.SqlClient นั่นเป็นเหตุผลที่เราจำเป็นต้องติดตั้งแพคเกจ nuget ของ EntityFramework ที่มีสอง dll แต่ถ้าเรากำลังพัฒนาแอปพลิเคชันคอนโซลเท่านั้นแล้วเราก็ต้องเพิ่มการอ้างอิงของ EntityFramework.SqlServer.dll

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