ประเภทผู้ให้บริการ 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.