c# - इकाई फ्रेमवर्क प्रदाता प्रकार लोड नहीं किया जा सका?




entity-framework mstest (20)

मैं टीमसिटी पर अपने परीक्षण चलाने की कोशिश कर रहा हूं जो वर्तमान में मेरी मशीन पर स्थापित है।

System.InvalidOperationException :

एंटीटी फ्रेमवर्क प्रदाता प्रकार ' 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 कोई संदर्भ नहीं है जैसा कि EF6 को अपग्रेड करने के लिए कोडप्लेक्स पर सुझाया गया था।

तो, मुझे यकीन नहीं है कि मुझे यह अपवाद क्यों मिल रहा है। जब मैं वीएस से परीक्षण चलाता हूं तो मुझे ऐसा कोई अपवाद नहीं मिलता है।

मैंने CopyLocal को फिर से गलत करने के लिए फिर से सेट करने का प्रयास किया .. लेकिन ऐसा लगता है कि यह भी काम नहीं करता है।

अद्यतन करें

मेरे app.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>

मुझे टीमसिटी में निम्नलिखित स्टैकट्रैक मिलता है।

[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

Nuget आपके EF6 प्रोजेक्ट को EntityFramework.SqlServer.dll संदर्भित करने के लिए कॉन्फ़िगर करेगा। यह बिल्ड के दौरान आपके ईएफ 6 प्रोजेक्ट के आउटपुट फ़ोल्डर में तैनात है, लेकिन यह आपके ईएफ 6 प्रोजेक्ट को संदर्भित करने वाली परियोजनाओं के आउटपुट फ़ोल्डर पर तैनात नहीं होगा। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि विजुअल स्टूडियो यह समझने के लिए पर्याप्त "स्मार्ट" है कि आपकी असेंबली में कुछ भी वास्तव में डीएलएल का उपयोग नहीं कर रहा है और इसलिए इसमें शामिल नहीं है। EntityFramework.SqlServer.dll का उपयोग करने वाली आपके ईएफ 6 प्रोजेक्ट में कोड जोड़कर आप अपने ईएफ 6 प्रोजेक्ट (यूनिट टेस्ट, यूआई इत्यादि) को संदर्भित करने वाले प्रोजेक्ट्स के आउटपुट फ़ोल्डर में एंटीटीफ्रेमवर्क.SqlServer.dll को तैनात कर सकते हैं। सावधान रहें कि कोड को जेनरेट क्लास में न डालें क्योंकि आप इसे अगले regen पर खोने का जोखिम उठाते हैं। मैंने निम्नलिखित वर्ग को असेंबली में जोड़ना चुना, जिसने समस्या को हल किया।

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://.com/a/22315164/1141360.
    private static SqlProviderServices instance = SqlProviderServices.Instance;
}

एक आसान फिक्स है। अपनी परियोजना में संदर्भ खोलें, "System.Data" -> गुणों पर राइट क्लिक करें। "स्थानीय कॉपी करें" को "True" में बदलें।

समस्या तय की जानी चाहिए।


परियोजना से इकाई फ्रेमवर्क को nuget के माध्यम से हटा दें और फिर इसे वापस जोड़ें।


पार्टी के लिए देर हो गई, लेकिन शीर्ष वोट दिए गए सभी जवाब मुझे हैक की तरह लग रहा था।

मैंने जो कुछ किया वह परीक्षण परियोजना में मेरे 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>

मुझे अपनी टेस्ट परियोजनाओं में भी यही समस्या थी - मैंने NuGet के माध्यम से नवीनतम ईएफ 6 बिट्स स्थापित किए और हर बार जब मैंने कुछ ईएफ-संबंधित मुझे आमंत्रित किया:

'System.Data.SqlClient' ADO.NET प्रदाता के लिए एंटीटी फ्रेमवर्क प्रदाता प्रकार 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'। 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 सामग्री का उपयोग किए बिना परीक्षण विफल हो जाता है।

वैसे भी: मेरी मशीन पर काम करता है;)

नोट: प्रोजेक्ट का परीक्षण करने के लिए विधि जोड़ने के बजाय आप अपने मॉडल / इकाई प्रोजेक्ट से एसक्लप्रोवाइडर सर्विसेज का एक स्थिर संदर्भ सुनिश्चित कर सकते हैं ।


मुझे अपने सीआई बिल्ड सर्वर (बांस चलाना) पर बिल्कुल वही समस्या आई थी, जो उस पर कोई भी विजुअल स्टूडियो आईडीई स्थापित नहीं करता है।

निर्माण / परीक्षण प्रक्रिया के लिए कोई भी कोड बदलने के बिना (जो मुझे नहीं लगता कि यह अच्छा समाधान है), सबसे अच्छा तरीका EntityFramework.SqlServer.dll प्रतिलिपि EntityFramework.SqlServer.dll और उसे C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE पेस्ट करना है C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE । (जहां आपका सबसे बढ़िया चल रहा है)

समस्या सुलझ गयी!


मुझे बस एक ही त्रुटि संदेश था।

मेरे पास डेटा एक्सेस के लिए एक अलग परियोजना है। वेब प्रोजेक्ट चला रहा है (जो डेटा प्रोजेक्ट का संदर्भ देता है) स्थानीय रूप से ठीक काम करता है। लेकिन जब मैंने असेंबली को अजीब करने के लिए वेब प्रोजेक्ट को तैनात किया: EntityFramework.SqlServer की प्रतिलिपि नहीं बनाई गई थी। मैंने अभी वेब प्रोजेक्ट का संदर्भ जोड़ा और फिर से तैनात किया, अब यह काम करता है।

उम्मीद है कि यह दूसरों की मदद करता है


मुझे भी इसी तरह की समस्या थी

मेरी समस्या हल करके हल की गई थी:


मेरा समाधान परियोजना से इकाई फ्रेमवर्क को न्यूज मैनेजर के माध्यम से निकालना था और इसे वापस जोड़ना था।


मेरे मामले में dll की प्रतिलिपि नहीं बनाई गई थी, हालांकि मैंने इसका संदर्भ जोड़ा। ऐसा इसलिए है क्योंकि EntityFramework.SqlServer.dll को आपकी प्रोजेक्ट में कॉपी नहीं किया गया है। उस डीएलएल को जोड़ें और यह उम्मीदपूर्वक काम करेगा। आप उस परियोजना से पा सकते हैं जहां आपने डाटामॉडल जोड़ा था।


मेरे मामले में समस्या यह थी कि एक और अपवाद पकड़ने के लिए मैंने सामान्य भाषा रनटाइम (सीएलआर) अपवादों को सक्षम किया था। और मैं इसे अक्षम करना भूल गया।

मैंने इसे अपवाद सेटिंग में अक्षम कर दिया। और इस अपवाद को अनदेखा कर दिया और मेरे लिए (मेरे मामले में) स्वचालित रूप से एक डीबी बनाने के लिए चला गया।


मैं अपने आवेदन प्रोजेक्ट (या मैन्युअल रूप से कुछ भी कॉपी करने के लिए) में ईएफ का संदर्भ नहीं चाहता था इसलिए मैंने इसे अपने ईएफ प्रोजेक्ट के पोस्ट-बिल्ड इवेंट में जोड़ा:

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

मैंने अंततः इसे हल किया। बाहर निकलता है, मेरे पास मेरे भंडार वर्ग में IDIsposable का गलत कार्यान्वयन था। मैंने तय किया ग़लत कार्यान्वयन के कारण स्टैक ओवरफ्लो अपवाद हुआ क्योंकि मैं संसाधनों का सही ढंग से निपटान नहीं कर रहा था। इसने वीएस को परीक्षण नहीं चलाया और परीक्षण निष्पादन इंजन दुर्घटनाग्रस्त हो गया।

मैंने इसे माइक्रोसॉफ्ट के साथ यहां दायर किया (यह सही समाधान मिलने से पहले था)। connect.microsoft.com/VisualStudio/feedback/details/775868/vs-test-execution-crashes-in-vs-2012#details

वैसे भी, बिल्ड अब टीमसिटी पर ठीक है। हालांकि, मैं अभी भी उत्सुक हूं कि क्यों न तो वीएस टेस्ट निष्पादन इंजन के पास मुझे यह बताने का एक शानदार तरीका था कि टीम सिटी नहीं हो रहा था।

मैंने परीक्षण को मैन्युअल रूप से डिबग करके मूल कारण खोजा (जिसे मैंने केवल इतना दिनों के बाद महसूस किया, फिक्स ने मुझे 5 सेकंड लिया)।

उम्मीद है कि इससे ऐसे मुद्दों में मदद मिलेगी जो इस तरह के मुद्दों पर आते हैं।


मैंने इसे अपने डीबीसीएन्टेक्स्ट क्लास के शीर्ष पर एक उपयोग करने वाला नियम जोड़कर हल किया, जैसे:

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

मैंने मैन्युअल रूप से EntityFramework.SqlServer.dll फ़ाइल को मुख्य एप्लिकेशन के bin folder में कॉपी करके हल किया है।


मैंने यूनिट टेस्ट प्रोजेक्ट में डीबग आउटपुट विंडो की जांच की। EntityFramework.SqlServer.dll लोड नहीं किया गया था। इसे बिन फ़ोल्डर परीक्षण में जोड़ने के बाद सफलतापूर्वक चलाया गया।


यह केवल मेरे भार / इकाई परीक्षण परियोजनाओं के अंदर होता है। निराशाजनक, मैं इसे एक परियोजना में फसल कर रहा था जिसे मैं 2 साल तक चला रहा हूं। परीक्षणों का कुछ क्रम होना चाहिए जो चीजों को तोड़ देता है। मुझे लगता है कि एक बार फाई हटा दिया जाता है।

मैंने पाया कि बस एक वैरिएबल घोषित करना जो सही मान का उपयोग करता है, समस्या को हल करता है ... मैं कभी भी विधि को कॉल नहीं करता हूं। बस इसे परिभाषित करें। अजीब लेकिन यह काम करता है।

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

यहां सभी उपयोगी सुझावों के अतिरिक्त, यदि आप ईएफ 6.1.3 का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके प्रोजेक्ट का .NET संस्करण 4.5 या अधिक है।


वही समस्या है, लेकिन मैंने Nuget के माध्यम से ईएफ 6 स्थापित किया। EntityFramework.SqlServer किसी अन्य निष्पादन योग्य के लिए अनुपलब्ध था। मैंने बस उस परियोजना में nuget पैकेज जोड़ा।


संदर्भ परियोजना में Entityframework.dll और Entityframework.sqlserver.dll जोड़ना समस्या हल हो गई।





entity-framework-6