ประเภทผู้ให้บริการ Entity Framework ไม่สามารถโหลดได้?


420

ฉันพยายามเรียกใช้การทดสอบของฉันบน TeamCity ซึ่งปัจจุบันติดตั้งอยู่ในเครื่องของฉัน

System.InvalidOperationException:

องค์กร Framework ประเภทผู้ให้บริการSystem.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'สำหรับ ' System.Data.SqlClient' ผู้ให้บริการ ADO.NET ไม่สามารถโหลด ตรวจสอบให้แน่ใจว่าแอสเซมบลีของผู้ให้บริการพร้อมใช้งานสำหรับแอปพลิเคชันที่ทำงานอยู่

ดูhttp://go.microsoft.com/fwlink/?LinkId=260882สำหรับข้อมูลเพิ่มเติม ..

ฉันไม่มีการอ้างอิงถึงSystem.Data.Entityในโครงการใด ๆ ของฉันตามที่แนะนำบน codeplex สำหรับอัพเกรดเป็น EF6

ดังนั้นฉันไม่แน่ใจว่าทำไมฉันถึงได้รับข้อยกเว้นนี้ ฉันไม่ได้รับข้อยกเว้นเช่นนี้เมื่อฉันทำการทดสอบจาก VS

ฉันพยายามตั้งค่า CopyLocal เป็น false จากนั้นอีกครั้งเป็นจริง .. แต่นั่นก็ไม่ได้ผลเหมือนกัน

ปรับปรุง

แอพของฉัน. config มีดังต่อไปนี้ สิ่งนี้ทำให้เกิดพฤติกรรมบางอย่างที่ฉันไม่เข้าใจหรือไม่?

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

ฉันได้รับ stacktrace ต่อไปนี้ใน teamcity

[MSTest] IntegrationTests.CrudTest+QuestionTest.Create
[03:59:11][IntegrationTests.CrudTest+QuestionTest.Create] Initialization method IntegrationTests.CrudTest+QuestionTest.Initialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 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..
[03:59:11]
[IntegrationTests.CrudTest+QuestionTest.Create]     at System.Data.Entity.Config.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName)
   at System.Data.Entity.Config.ProviderServicesFactory.GetInstanceByConvention(String providerInvariantName)
   at System.Data.Entity.Config.DefaultProviderServicesResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.CachingDependencyResolver.<>c__DisplayClass1.<GetService>b__0(Tuple`2 k)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Data.Entity.Config.CachingDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.RootDependencyResolver.GetService(Type type, Object key)
   at System.Data.Entity.Config.ResolverChain.<>c__DisplayClass3.<GetService>b__0(IDbDependencyResolver r)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Config.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Config.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Config.IDbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Config.InternalConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Config.DbConfiguration.GetService[TService](Object key)
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderServices(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DefaultManifestTokenService.GetProviderManifestToken(DbConnection connection)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at EFRepository.Infrastructure.EFRepository`1.Add(T item) in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\Repository\Infrastructure\EFRepository.cs:line 22
   at IntegrationTests.CrudTest.Initialize() in c:\TeamCity\buildAgent\work\da2ea4e72c0e77f0\IntegrationTests\CrudTest.cs:line 34

1
EntityFramework.SqlServer.dll ถูกปรับใช้พร้อมกับ EntityFramework.dll หรือไม่ ในผู้ให้บริการ EF6 SqlServer และ SqlServerCE ไม่ได้อยู่ในชุดประกอบเดียวกับเอ็นจิ้นของ EF เหมือนกับรุ่นก่อน ๆ คุณไม่ควรเพิ่มการอ้างอิงถึง System.Data.Entity.dll โมเดลผู้ให้บริการใน EF6 เปลี่ยนไปเมื่อเทียบกับผู้ให้บริการ EF5 และ EF5 จะไม่ทำงาน นอกจากนี้คุณยังสามารถพบกับปัญหายุ่งยากบางอย่าง (เช่นประเภทภูมิสารสนเทศ EF5 ที่ถือว่าเป็นประเภทเอนทิตีใน EF6)
Pawel

ใช่ฉันได้ตรวจสอบสองครั้งแล้วไม่มีการอ้างอิงถึง System.Data.Entity และการอ้างอิงถึงทั้ง EntityFramework.dll และ EntityFramework.SqlServer.dll มีอยู่ การคอมไพล์และการทดสอบ projetc ทำงานอีกครั้งใน VS เมื่อฉันทำการทดสอบรันบน TeamCity เท่านั้นข้อผิดพลาดจะหมดไป
Ashutosh raina

นี่เป็นการตั้งค่าที่ถูกต้อง ฉันไม่ได้ใช้ TeamCity แต่ปรากฏว่าเมื่อแอพของคุณถูกปรับใช้เพื่อรันการทดสอบกับ TeamCity EntityFramework.SqlServer.dll จะหายไปและดังนั้นจึงเป็นข้อยกเว้น
Pawel

1
ดูคำตอบจากโพสต์นี้: stackoverflow.com/questions/21175713/…ฉันได้เพิ่มprivate volatile Type _dependency...คำตอบแล้วและมันก็ใช้ได้! มันก็แค่ว่าฉันต้องเพิ่มชั้นเรียนแบบนี้เพื่อให้ EF ทำงานใน TeamCity
a11smiles

2
ฉันถอนการติดตั้ง EntityFramework จากแพคเกจ nuget และติดตั้งอีกครั้งและได้รับการแก้ไข
abhyudayasrinet

คำตอบ:


426

ปัญหาเดียวกัน แต่ฉันติดตั้ง EF 6 ผ่าน Nuget EntityFramework.SqlServer หายไปสำหรับการปฏิบัติการอื่น ฉันเพิ่งเพิ่มแพ็คเกจ nuget ให้กับโครงการนั้น


108
ฉันก็สังเกตเห็นสิ่งนี้เช่นกัน ถ้าคุณสร้างไลบรารีที่ใช้ EF, VS จะใส่ EF.dll และ EF.SqlServer.dll ลงในโฟลเดอร์บิลด์นั้น แต่ถ้าคุณมีโปรแกรมอื่นใช้ประโยชน์จากไลบรารีของคุณเฉพาะ EF.dll เท่านั้นที่จะถูกใส่ลงในโฟลเดอร์ build นี้ EF.SqlServer.dll หายไป หากคุณเพิ่มลงในโฟลเดอร์บิลด์ด้วยตนเองโปรแกรมจะทำงาน ไม่ใช่วิธีแก้ปัญหาที่ดีในตัวเอง แต่แสดงว่าปัญหาคือ EF.SQLServer.dll ที่ขาดหายไปเป็นสาเหตุของข้อผิดพลาด
Eric

44
ฉันเพิ่ม var x = typeof (System.Data.Entity.SqlServer.SqlProviderServices); แอปของฉันทำงาน
Brian

33
ฉันมักจะกังวลเมื่อฉันพิมพ์รหัสที่ไม่ทำอะไรเลยและโครงการของฉันทำงานทันที O_o
Jordan

10
นอกจากนี้เนื่องจากการเพิ่มประสิทธิภาพของคอมไพเลอร์คุณอาจต้องการที่จะทำx.ToString()หรือมันจะออกมาtypeofในรุ่น
Jordan

15
ฉันพบว่ามันน่ารำคาญที่ตอนนี้ EF 6.1 จำเป็นต้องติดตั้ง EF ใน ASPX DLL / Project ของฉันในขณะที่ EF 5.0 จำเป็นต้องใช้กับ DLL / Project ของ data-layer เท่านั้น
PeterX

274

ฉันมีปัญหาเดียวกันในโครงการทดสอบ - ฉันติดตั้งบิตล่าสุดของ EF6 ผ่าน NuGet และทุกครั้งที่ฉันเรียกใช้บางสิ่งที่เกี่ยวข้องกับ EF ฉันได้รับ:

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

วิธีแก้ปัญหาของฉัน: ฉันวางวิธีนี้ในโครงการทดสอบของฉัน:

public 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;
}

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

Anyways: ทำงานบนเครื่องของฉัน;)

หมายเหตุ: แทนที่จะเพิ่มวิธีทดสอบโครงการคุณสามารถมั่นใจได้ถึงการอ้างอิงแบบคงที่ไปยัง SqlProviderServices จากโครงการ Model / entity ของคุณ


24
ในที่สุดฉันก็ลงมือทำเช่นเดียวกัน ฉันต้องการพูดคุยกับบุคคลที่ทำให้การชุมนุมนี้พึ่งพาการเปิดการเชื่อมต่อกับฐานข้อมูล ในจักรวาลสำรองโครงการส่วนหน้าทั้งหมดของเราที่มีไฟล์กำหนดค่าด้วยสตริงการเชื่อมต่อควรอ้างอิง EntityFramework เพียงเพื่อรับ dll นี้เพื่อเปิดการเชื่อมต่อ ฉันไม่เข้าใจเรื่องนี้ในทางใด
juhan_h

3
มันเป็นแฮ็ค แต่มันเป็นทางออกที่ดีที่สุด / ง่ายที่สุดที่ฉันพบในสถานการณ์ที่คุณไม่ได้สร้างแพ็คเกจการปรับใช้สำหรับโครงการของคุณ
Kon

3
สำหรับทุกท่านที่ใช้คำแนะนำอื่น ๆ เช่น "var x = typeof (SqlProviderServices);" โซลูชั่นนี้จัดทำโดย Robert เท่านั้นที่ทำงานเกี่ยวกับการพัฒนาและสร้างเครื่องจักร !!!
Alexander Schmidt

3
ขอบคุณ Robert มันไร้สาระโดยทีม EF แต่อย่างไรก็ตามมันก็ใช้ได้สำหรับฉัน
Hitesh

7
เพื่อให้ชัดเจน: การเพิ่มโค้ดด้านบนให้กับDbContextชั้นเรียนของคุณจะช่วยแก้ปัญหาใน EF 6.1 วิธีนี้คุณไม่จำเป็นต้องรวมแพ็คเกจ Entity Framework Nuget ในส่วนหน้า (WebApi ฯลฯ ) และสามารถปล่อยให้ทุกสิ่งที่เกี่ยวข้องกับ EF ในชั้นข้อมูลของคุณ
Nick

106

Nuget จะกำหนดค่าโครงการ EF6 ของคุณเพื่ออ้างอิง EntityFramework.SqlServer.dll สิ่งนี้นำไปใช้กับโฟลเดอร์เอาท์พุทสำหรับโครงการ EF6 ของคุณในระหว่างการสร้าง แต่จะไม่นำไปใช้กับโฟลเดอร์เอาท์พุทสำหรับโครงการที่อ้างอิงโครงการ EF6 ของคุณ ฉันเชื่อว่าเป็นเพราะ Visual Studio เป็น "สมาร์ท" เพียงพอที่จะตรวจสอบว่าไม่มีอะไรในแอสเซมบลีของคุณเป็นจริงโดยใช้ dll โดยตรงและดังนั้นจึงไม่รวม คุณสามารถบังคับให้ EntityFramework.SqlServer.dll ถูกปรับใช้ไปยังโฟลเดอร์ผลลัพธ์ของโครงการที่อ้างอิงโครงการ EF6 ของคุณ (การทดสอบหน่วย, UI ฯลฯ ) โดยเพิ่มรหัสให้กับโครงการ EF6 ของคุณที่ใช้ EntityFramework.SqlServer.dll ระวังอย่าใส่รหัสในชั้นเรียนที่สร้างขึ้นเพราะคุณเสี่ยงต่อการสูญเสียรหัสผ่านในการลงทะเบียนครั้งต่อไป ฉันเลือกที่จะเพิ่มคลาสต่อไปนี้ลงในแอสเซมบลีซึ่งแก้ไขปัญหาได้

using System.Data.Entity.SqlServer;

internal static class MissingDllHack
{
    // Must reference a type in EntityFramework.SqlServer.dll so that this dll will be
    // included in the output folder of referencing projects without requiring a direct 
    // dependency on Entity Framework. See http://stackoverflow.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

1
วิธีนี้แก้ไขปัญหาสำหรับฉันที่เกี่ยวกับ MSTest ฉันชอบวิธีนี้เพราะไม่ต้องการให้ฉันทำอะไรยุ่งกับการสืบทอดคลาสในชั้นเรียนทดสอบของฉัน เพียงแค่รวมชั้นเรียนไว้ในชุดทดสอบและ MAGIC ขอบคุณ!
kbrimington

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

2
สำหรับผู้ที่ไม่ต้องการใช้เวลา 4 วินาทีในการค้นหา: ใช้ System.Data.Entity.SqlServer;
TTT

เราใช้คลาสพื้นฐานทั่วไปสำหรับการทดสอบหน่วยการทดสอบหน่วยทั้งหมดสืบทอดมาจากคลาสนี้ การเพิ่มเมธอดนี้ให้กับคลาสนั้นหมายความว่าโปรเจ็กต์ทั้งหมดที่มีคลาสการทดสอบหน่วยที่สืบทอดจากคลาสพื้นฐานทำงานตกลง
MaxJ

3
จุดเล็ก ๆ แต่อาจเป็นการดีที่สุดในการเพิ่มความคิดเห็นในคลาสนี้เพื่ออธิบายว่าทำไมจึงมีความจำเป็น
John Darvill

43

โซลูชันของฉันคือการลบเฟรมเวิร์กเอนทิตี้ออกจากโครงการผ่านทางผู้จัดการ nuget และเพิ่มกลับเข้าไปใหม่


9
PM> Update-Package -Reinstall "EntityFramework" -ProjectName "MyProj1"
VahidN

สิ่งนี้ได้ผลสำหรับฉันและฉันคิดว่ามันอาจเป็นทางออกที่ดีที่สุด
ccoutinho

วิธีแก้ปัญหาที่ง่ายและสะอาด ควรสูงกว่ามากในรายการ
โหมด 777

29

ฉันแก้ไขได้โดยเพิ่ม stament ที่ใช้อยู่ด้านบนของชั้น DBContext ของฉันเช่น:

using SqlProviderServices= System.Data.Entity.SqlServer.SqlProviderServices;

1
นี่เป็นวิธีการแก้ปัญหาที่สะอาดที่สุดสำหรับปัญหานี้ ขอบคุณ.
Alexandru Dicu

วิธีนี้ใช้งานได้และดูสะอาดตา คำถาม: เราจะไม่ปล่อยหมายเลขบรรทัดที่คลาส DBContext ถูกรีเฟรชหรือไม่ คือการใช้การสร้างคลาส edmx?
NoloMokgosi

ไม่อยากเชื่อเลยว่านี่เป็นสิ่งที่จำเป็นและ Microsoft ก็ไม่ได้รับการแก้ไข แต่สิ่งนี้ใช้ได้ผลกับฉัน ขอบคุณสำหรับวิธีแก้ปัญหาง่ายๆ
ซาร์ Bomba

การแก้ปัญหานี้คือการทำงานเช่นเดียวกับMissingDllHack มันอาจดูสะอาดกว่า แต่แนะนำรหัสวิธีแก้ไขในคลาสบริบทของคุณ รหัสนี้จะถูกตั้งค่าสถานะเพื่อลบโดยเครื่องมือเช่น ReSharper และอาจสูญหายได้อย่างง่ายดายในช่วงเวลา ทางออกที่ดี แต่ฉันชอบที่จะแยกวิธีแก้ปัญหาออกจากบริบทในวิธีที่ไม่สร้างคำเตือนรหัส
Timothy Schoonover

20

ฉันใช้การลงทะเบียนด้วยรหัสสำหรับผู้ให้บริการ link1 link2

เพิ่งสร้างคลาสการกำหนดค่าเช่น

class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        this.SetDatabaseInitializer(new DropCreateDatabaseAlways<MyDbContext>());
        this.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}

จุดสำคัญคือthis.SetProviderServices (SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);

และใช้ในวิธีดังกล่าว

[DbConfigurationType(typeof(DbContextConfiguration))]
public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        ...
    }

    public DbSet<...> ...{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
    }
}

ฉันมีสองโครงการในโซลูชันเดียว แรกคือไลบรารีคลาสที่มีเฟรมเวิร์กเอนทิตีประกอบเป็นคลาส DbContext และไฟล์ tt โครงการที่สองคือรูปแบบ windows ที่ควรได้รับข้อมูลโดยใช้ ef-project @Nash: คุณช่วยอธิบายรายละเอียดที่ (เข้าโครงการ) ที่คุณวางไว้ชั้นเรียนของคุณDbContextConfiguration? ขอบคุณ
surfmuggle

ดังกล่าวข้างต้นดูเหมือนว่าการอ้างอิงเพิ่มเติมเป็นวิธีหนึ่งในการแก้ไขปัญหานี้ (ดูความคิดเห็นจาก eric) ฉันใช้คอนโซล nuget และใช้คำสั่งนี้: Get-Project MyWinformsProject | Install-Package EntityFrameworkซึ่งแก้ไขให้ฉัน ยังฉันอยากจะเข้าใจเหตุผล
surfmuggle

DbContextConfiguration ดูเหมือนจะมีอยู่แล้ว (vs 2013) การเพิ่มบรรทัด DbConfiguraton เหนือคลาส MyDbContext ของฉันไม่ได้แก้ปัญหาสำหรับฉัน
Anders Lindén

คุณไม่ต้องการคลาสDbConfiguration ใส่รหัสต่อไปนี้ที่เริ่มต้น app (ก่อนที่จะถูกนำมาใช้ DbConfiguration.Loaded += (sender, e) => e.ReplaceService<DbProviderServices>((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance);EF):
Rosberg Linhares

14

ฉันแยกมันออกด้วย [DeploymentItem] ในการเริ่มต้นการประกอบชั้นเรียนของฉัน

namespace MyTests
{
    /// <summary>
    /// Summary description for AssemblyTestInit
    /// </summary>
    [TestClass]
    [DeploymentItem("EntityFramework.SqlServer.dll")]
    public class AssemblyTestInit
    {
        public AssemblyTestInit()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [AssemblyInitialize()]
        public static void DbContextInitialize(TestContext testContext)
        {
            Database.SetInitializer<TestContext>(new TestContextInitializer());
        }
    }
}

9

มาปาร์ตี้ช้า แต่ผู้โหวตสูงสุดตอบทุกคนก็ดูเหมือนจะแฮ็คกับฉัน

ทั้งหมดที่ฉันทำคือลบสิ่งต่อไปนี้ออกจาก app.config ของฉันในโครงการทดสอบ ทำงาน

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

ทางออกที่แท้จริง!
เบ็น F

8

ฉันมีปัญหาเพราะฉันไม่ได้เพิ่มการอ้างอิงถึง EntityFramework.sqlServer.dll เมื่อฉันพัฒนาโปรแกรมมันใช้งานได้ แต่เมื่อฉันเผยแพร่แอพและติดตั้งมันก็เกิดข้อผิดพลาด

ฉันแค่เพิ่มการอ้างอิงและสร้างและเผยแพร่อีกครั้ง

อ้างอิง


ฉันทำสิ่งนี้และมันได้ผล โดยทั่วไปโครงการจะแสดงคำเตือนเมื่อส่วนประกอบไปยังไลบรารีที่ไม่ได้เรียกอย่างถูกต้อง
kbvishnu

5

ฉันได้แก้ไขสิ่งนี้ด้วยการคัดลอกEntityFramework.SqlServer.dllไฟล์ไปยังbin folderแอปพลิเคชันหลักด้วยตนเอง


4

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

ฉันยื่นกับ Microsoft ที่นี่ (นี่คือก่อนที่ฉันจะได้รับโซลูชั่นที่ถูกต้อง) connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

อย่างไรก็ตามตอนนี้บิลด์ทำงานได้ดีบน teamcity แม้ว่าฉันยังสงสัยอยู่ว่าทำไมเครื่องมือทดสอบการทำงานของ VS Test จึงไม่มีวิธีที่ดีในการบอกฉันว่าเกิดอะไรขึ้นไม่ใช่ Team City

ฉันค้นพบสาเหตุที่แท้จริงด้วยการดีบักการทดสอบด้วยตนเอง (ซึ่งฉันรู้ได้หลังจากผ่านไปหลายวันเท่านั้นการแก้ไขใช้เวลาฉัน 5 วินาที)

หวังว่านี่จะช่วยคนที่เจอปัญหาดังกล่าว


4

ฉันเห็นปัญหาที่คล้ายกันและใช้วิธีการจากโพสต์นี้: ( http://entityframework.codeplex.com/workitem/1590 ) ซึ่งแก้ปัญหาของฉัน

เมื่อต้องการแก้ไขปัญหาคุณสามารถสร้างแอสเซมบลีการทดสอบของคุณอ้างอิงแอสเซมบลีของผู้ให้บริการโดยตรงโดยการเพิ่มบรรทัดเช่นนี้ที่ใดก็ได้ในแอสเซมบลีการทดสอบ: var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance


3

เมื่อฉันตรวจสอบปัญหาฉันพบว่า dll ต่อไปนี้หายไปในโฟลเดอร์ผลลัพธ์ ทางออกที่ง่ายคือการคัดลอก Entityframework.dll และ Entityframework.sqlserver.dll ด้วย app.config ไปยังโฟลเดอร์ผลลัพธ์หากแอปพลิเคชันอยู่ในโหมดแก้ไขข้อบกพร่อง ในเวลาเดียวกันการเปลี่ยนแปลงพารามิเตอร์ตัวเลือกการสร้าง "คัดลอกไปยังโฟลเดอร์ผลลัพธ์" ของ app.config เพื่อคัดลอกเสมอ นี่จะช่วยแก้ปัญหาของคุณ


2
ฉันตั้งค่า "Copy Local" จริงสำหรับ "EntityFramework.SqlServer" เท่านั้น ตอนนี้มันใช้งานได้
Alezis

3

เพียงแค่อ้างอิงหรือเบราว์เซอร์ EF dll - EntityFramework.SqlServer.dll


นี่คือสิ่งที่ฉันทำ คัดลอกการอ้างอิงถึง "EntityFramework.SqlServer" จากไลบรารีของฉันไปยังโครงการ "กำลังทำงาน" นั่นได้ผล!
Håkon K. Olafsen

3

ฉันออกเหมือนกันฉันพยายามหลายครั้ง แต่มันก็ไม่ได้แก้ปัญหา แต่เมื่อฉันติดตั้งแพคเกจ

Install-Package EntityFramework.SqlServerCompact

3

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


[DbConfigurationType(typeof(DbContextConfiguration))] public static class Startup { }

public class DbContextConfiguration : DbConfiguration
{
    public DbContextConfiguration()
    {
        // This is needed to force the EntityFramework.SqlServer DLL to be copied to the bin folder
        SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
    }
}


1
ขอบคุณ! นี่เป็นความช่วยเหลือครั้งใหญ่
แอดดิสัน Schuhardt

1
ดีใจที่คุณพบคำตอบของฉันเป็นประโยชน์ @AddisonSchuhardt :)
hatsrumandcode

2

ฉันไม่ต้องการการอ้างอิงถึง EF ในโครงการแอปพลิเคชันของฉัน (หรือคัดลอกอะไรก็ได้ด้วยตนเอง) ดังนั้นฉันจึงเพิ่มสิ่งนี้ลงในกิจกรรมหลังการสร้างของโครงการ EF:

cp $(TargetDir)EntityFramework.SqlServer.dll $(SolutionDir){your-main-bin-folder}

2

สิ่งนี้จะเกิดขึ้นภายในโครงการทดสอบโหลด / หน่วยของฉันเท่านั้น น่าผิดหวังฉันมี jyst มันปลูกในโครงการที่ฉันได้ทำงานเป็นเวลา 2 ปี จะต้องมีคำสั่งของการทดสอบการทำงานที่ทำลายสิ่งต่างๆ ฉันเดาว่า fi นั้นได้ลบมันออกไปแล้ว

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

    /// <summary>
    /// So that the test runner copies dlls not directly referenced by the integration project
    /// </summary>
    private void referenceLibs()
    {
        var useless = SqlProviderServices.Instance;
    }

2

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

การลบโฟลเดอร์ BIN- ทำเพื่อฉัน

และมันก็ใช้ได้กับฉันเช่นกัน


1
ฉันรวมสาขา 2 แห่ง - โครงการของฉันไม่มีการเปลี่ยนแปลงที่เกี่ยวข้องกับ EF แต่ unittests ของฉันเพิ่งเริ่มล้มเหลวโดยไม่มีเหตุผล การลบโฟลเดอร์ BIN ทำให้พวกเขาทำงานอีกครั้ง
Arno Peters

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

1

การเพิ่ม Entityframework.dll และ Entityframework.sqlserver.dll ให้กับโครงการอ้างอิงแก้ไขปัญหาได้


1

ฉันตรวจสอบหน้าต่าง Debug Output ในโครงการทดสอบหน่วย EntityFramework.SqlServer.dll ไม่ได้ถูกโหลด หลังจากเพิ่มไปยังการทดสอบโฟลเดอร์ถังก็ทำงานได้สำเร็จ


1

ฉันยังมีปัญหาที่คล้ายกัน

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

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

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


1

ฉันมีปัญหาเดียวกันกับDBContextวัตถุinstantiating จากโครงการทดสอบหน่วย ฉันตรวจสอบแพคเกจการทดสอบหน่วยของฉันและคิดว่าEntityFrameworkแพ็กเกจนั้นไม่ได้ติดตั้งฉันติดตั้งจาก Nuget และแก้ไขปัญหา (ฉันคิดว่าเป็นข้อบกพร่องของ EF)

การเข้ารหัสที่มีความสุข


0

ฉันเพิ่งได้รับข้อความแสดงข้อผิดพลาดเดียวกัน

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

หวังว่านี่จะช่วยผู้อื่น


0

ฉันกำลังทำงานเกี่ยวกับการสอนของ Contoso University แบบออฟไลน์และพบปัญหาเดียวกันเมื่อพยายามสร้างตัวควบคุมแรกของฉันโดยใช้ EF ฉันต้องใช้ Package Manager Console เพื่อโหลด EF จากแคช nuget และสร้างสตริงการเชื่อมต่อกับอินสแตนซ์ในเครื่องของฉันใน SQL Server จุดของฉันที่นี่คือการตั้งค่า webConfig ของฉันสำหรับ EF อาจไม่ได้รับการตั้งค่าตามที่คุณทุกคน เพื่อแก้ไขปัญหาของฉันโดยการลบส่วน "ผู้ให้บริการ" ภายใน "entityFramework" อย่างสมบูรณ์

โรเบิร์ต


0

มีการแก้ไขที่ง่าย เปิดการอ้างอิงในโครงการของคุณคลิกขวาที่ "System.Data" -> Properties เปลี่ยน "Copy Local" เป็น "True"

ปัญหาควรได้รับการแก้ไข


0

ในกรณีของฉันฉันแก้ไขปัญหาด้วยการติดตั้ง SQL Server 2012 Developer Edition เมื่อก่อนหน้านี้ฉันได้ติดตั้ง SQL Server Express 2012 (x64) ดูเหมือนว่าให้ฉันกับการพึ่งพาที่ขาดหายไป


0

ลบเฟรมเวิร์กเอนทิตีออกจากโครงการผ่านทาง nuget แล้วเพิ่มกลับเข้าไปใหม่


0

ในกรณีของฉันdllไม่ได้คัดลอกแม้ว่าฉันจะเพิ่มการอ้างอิงถึง นี่เป็นเพราะEntityFramework.SqlServer.dllไม่ได้คัดลอกไปยังโครงการของคุณ เพิ่ม dll นั้นและหวังว่ามันจะทำงานคุณสามารถหามันได้จากโครงการที่คุณเพิ่ม datamodel


0

เพิ่มเติมจากคำแนะนำที่เป็นประโยชน์ทั้งหมดที่นี่ถ้าคุณใช้ EF 6.1.3 ตรวจสอบให้แน่ใจว่าเวอร์ชั่น. net ของโครงการของคุณคือ 4.5 หรือมากกว่า

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