2010-10-27 8 views
9

Sto provando l'Enterprise Library 5.0 e stavo facendo alcuni test unitari sul mio BL, ho bisogno di avere un'app. config sul DL o sul progetto Test?Errore di attivazione durante il tentativo di ottenere l'istanza di tipo Database, chiave "" <- vuoto

nota: ho già le impostazioni di configurazione sul mio web.config sul mio progetto web.

come uso il DAAB:

private static Database db = DatabaseFactory.CreateDatabase(); 

db.ExecuteNonQuery("spInsertSalesman", salesman.Fullname); 

mio app.config sul DL:

<configuration> 
    <configSections> 
     <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" /> 
    </configSections> 
    <dataConfiguration defaultDatabase="DBTEST" /> 
    <connectionStrings> 
     <add name="DBTEST" connectionString="Data Source=[dbsource];Initial Catalog=[dbname];User Id=sa;Password=password;" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 
+0

qualcuno qui che può aiutare? –

+0

Il file di configurazione dovrebbe probabilmente essere con il progetto di test, ma non sono sicuro che funzioni. Quale framework di test stai usando? –

+1

sì, ho capito che stavo facendo riferimento alla copia errata .dll. funziona ora, grazie per l'aiuto./ –

risposta

0

stavo referenziazione la copia dll sbagliata. ora funziona.

+0

Per me, ancora non funziona – Harsh

0

Come le librerie di classi possono avere il file app.config. Non è davvero utile quando si utilizza EntLib 5.0 & per accedere alla stringa di connessione nella libar della classe. Quindi è necessario aggiungere la configurazione di cui sopra a tutti i file web.config che si stanno utilizzando nella soluzione. Ad esempio, se si dispone di livello dell'interfaccia utente, il livello WCF tra Business (libreria di classi) e il livello dell'interfaccia utente e il livello aziendale si trovano tra il servizio WCF e il DAL (libreria di classi).

Qui si avrà un file web.config in ogni livello dell'interfaccia utente & del livello service WCF, quindi questi due file web.config dovrebbero contenere le impostazioni sopra menzionate.

-2

sono stato in grado di risolvere questo errore nel mio progetto DLL specificando il nome della stringa di connessione in modo esplicito nella chiamata CreateDatabase, in questo modo:

Database db = DatabaseFactory.CreateDatabase("DBTEST"); 

invece di

Database db = DatabaseFactory.CreateDatabase(); 
1

Questo è a causa della mancata corrispondenza delle dll tra le DLL di GAC (DLL nell'assembly) e le DLL riferite dall'applicazione.

Rimuovere le DLL dall'assieme e provare a eseguire.

  1. Start -> Esegui
  2. Assemblea Tipo
  3. Rimuovere la DLL per il quale l'errore di attivazione sta accadendo.
  4. Ripristinare l'IIS

Speriamo che risolverà il vostro problema.

0

Ho lo stesso problema e ho risolto dal cambiamento EntLib 5,0-3,1

2

Per aggiungere ad altri motivi.

Avevo una soluzione VS2010/csproj che faceva riferimento a Enterprise Library 5.0.xxxxx.

Tuttavia, csproj è stato impostato su "Target 3.5 Framework". Pertanto, dovevo scegliere come target il framework 4.0 OPPURE andare "down" alla versione 3.5 della Enterprise Library.

Sono stato in grado di aggiornare il framework di destinazione a 4.0 e quindi gli errori sono andati via.

Ecco cosa si può fare per capire quale versione quadro il codice è stato compilato per: (mini script di PowerShell)

[System.Reflection.Assembly]::LoadFrom("c:\somefolder\Any_Of_The_Practices.dll").ImageRuntimeVersion 

Se si ottiene v2.0.50727, allora avrai problemi a girare sotto Framework 4.0 (o superiore).

EDIT:

Ho anche ottenuto questo errore non avendo le "DbProviderFactories" corrette definiti. sto inviando una configurazione di MySql che ho trovato su questo URL: (sto copiando che, nel caso in cui l'URL muore in futuro)

(da http://searchcode.com/codesearch/view/14385662)

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true"/> 
</configSections> 

<system.data> 
<DbProviderFactories> 
<add name="EntLibContrib.Data.MySql" 
invariant="EntLibContrib.Data.MySql" 
description="EntLibContrib Data MySql Provider" 
type="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" /> 
</DbProviderFactories> 
</system.data> 

<dataConfiguration defaultDatabase="Default Connection String"> 
<providerMappings> 
<add databaseType="EntLibContrib.Data.MySql.MySqlDatabase, EntLibContrib.Data.MySql, Version=5.0.505.0, Culture=neutral, PublicKeyToken=null" 
name="EntLibContrib.Data.MySql"/> 
</providerMappings> 
</dataConfiguration> 

<connectionStrings> 
<add name="Default Connection String" 
connectionString="database=northwind;uid=root;pwd=admin" 
providerName="EntLibContrib.Data.MySql"/> 
</connectionStrings> 

<startup> 
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
</startup> 
</configuration> 

Infine:

Una volta ricevuto questo errore perché non avevo un ConnectionString (nel file di configurazione) con lo stesso nome del valore di defaultDatabase. Aka, il semplice errore "teschio intorpidito".

È possibile inserire questo codice della valvola di sicurezza (poco prima di creare il database), se lo si desidera.

 DatabaseSettings dataConfig = (DatabaseSettings)ConfigurationManager.GetSection("dataConfiguration"); 
     string configDefaultDatabase = string.Empty; 
     if (null != dataConfig) 
     { 
      configDefaultDatabase = dataConfig.DefaultDatabase; 

      if (!String.IsNullOrEmpty(configDefaultDatabase)) 
      { 
       ConnectionStringSettingsCollection connections = ConfigurationManager.ConnectionStrings; 
       if (null == connections[configDefaultDatabase]) 
       { 
        throw new ArgumentOutOfRangeException(
         string.Format(
          "Your dataConfiguration (DefaultDatabase) does not match any of your connection strings. DefaultDatabase='{0}'.", 
          configDefaultDatabase)); 
       } 
      } 
     } 
Problemi correlati