7

Io uso ODP.NET e la versione 4.1 della libreria Enterprise, rispetto al 2008. E tutto è OK.Non è possibile creare il tipo Database. È necessario configurare il contenitore per fornire questo valore (EntLib 5 + ODP.NET)

Ora eseguire la migrazione utilizzando ODP.NET Oracle.DataAccess 4.112.2.0 e versione 5.0.414.0 di Enterprise Library, 2010, .net 4.0.

Oracle.DataAccess 4.112.2.0 5.0.414.0 EnterpriseLibrary

seguito di un recente aggiornamento dalla versione 4,1-5,0 della Enterprise Library, una volta che otteniamo il seguente errore:

"il tipo di database non può essere costruito. Devi configurare il contenitore per fornire questo valore. "

Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type Database, key "ConnectionStrings.Oracle.xxx" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "ConnectionStrings.Oracle.xxx". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type Database cannot be constructed. You must configure the container to supply this value.

Riferimenti EntLib Forum: http://entlib.codeplex.com/discussions/215290

qualsiasi soluzione al riguardo ??

mia configurazione

<configSections> 

<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=709072f976b4c05b"/> 

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings,Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=709072f976b4c05b" /> 
</configSections> 

<dataConfiguration defaultDatabase="ConnectionStrings.Oracle.xxx"/> 

<connectionStrings> 

<add name="ConnectionStrings.Oracle.xxx" connectionString="DATA SOURCE=des;PASSWORD=zzz;PERSIST SECURITY INFO=True;USER ID=aaa;" 
providerName="Oracle.DataAccess.Client" /> 

My Code

var key = "ConnectionStrings.Oracle.xxx"; 

      Database db = Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance<Database>(key); //~(EntLib 5 recommended) 


      using (DbCommand cm = db.GetStoredProcCommand("TBL_FRKDATA.TBL_FRKDATA_FND_ALL")) 
      { 
       cm.Parameters.Add(CreateCursorParameter("P_REFCURSOR")); 

       // Using "using" will cause both the DataReader and connection to be 
       // closed. (ExecuteReader will close the connection when the 
       // DataReader is closed.) 
       using (IDataReader dataReader = db.ExecuteReader(cm)) 
       { 
        while (dataReader.Read()) 
        { 
         builder.Add(dataReader); 
        } 
        return builder.EntityList; 

       } 
      } 

errore completo stacktrace

Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.GuardTypeIsNonPrimitive(IBuilderContext context, SelectedConstructor selectedConstructor) Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy.CreatePlan(IBuilderContext context, NamedTypeBuildKey buildKey) Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable 1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides) Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService](String key)

UPDATE

questo codice funziona per me:

[TestMethod] 
    public void Conectar_con_EntLib_y_OdpNet_Test() 
    { 
     var key = "ConnectionStrings.Oracle.xxx"; 

     string connectionString = ConfigurationManager.ConnectionStrings[key].ConnectionString; 
     string providerName = ConfigurationManager.ConnectionStrings[key].ProviderName; 

     //Database db = Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current.GetInstance<Database>(key); 

     TestContext.WriteLine("connectionString: " + connectionString); 
     TestContext.WriteLine("providerName: " + providerName); 

     DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 

     using (DbConnection connection = factory.CreateConnection()) 
     { 
      connection.ConnectionString = connectionString; 

      connection.Open(); 

      TestContext.WriteLine("Estado Conexión: " + connection.State); 
      connection.Close(); 
     } 



    } 

Soluzione: da Randy Levy (http://entlib.codeplex.com/discussions/215290)

Non è possibile utilizzare l'Enterprise Library OracleDatabase con il provider Oracle.DataAccess.Client. Il database OracleDatabase integrato è codificato su utilizzando OracleClientFactory DbProviderFactory mentre si desidera utilizzare il provider ODP.NET (Oracle.DataAccess.Client).

Il modo migliore è ottenere il provider di dati Oracle ODP.NET EntLibContrib, poiché dovrebbe supportare tutto ciò che è necessario, inclusi i file di configurazione.

Dal momento che appare come è possibile creare il DbProviderFactory si potrebbe provare a utilizzare un GenericDatabase con l'ODP.NET OracleClientFactory ma direi che si incorrere in problemi di funzionalità specifiche di Oracle (ad esempio refcursor).

Si può usare direttamente:

string connectionString = ConfigurationManager.ConnectionStrings["Connection String"].ConnectionString; 
string providerName = ConfigurationManager.ConnectionStrings["Connection String"].ProviderName; 

DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); 
var db = new GenericDatabase(connectionString, factory); 
+0

Controllo rapido [post MSDN] (http://msdn.microsoft.com/en-us/library/ff953187 (v ​​= PandP.50) .aspx). Stati 'Tuttavia, tenere presente che il provider OracleClient è obsoleto nella versione 4.0 di .NET Framework, sebbene sia ancora supportato da Enterprise Library. Per lo sviluppo futuro, considera la scelta di un driver Oracle diverso. –

+0

Hai controllato http://stackoverflow.com/questions/4030436/activation-error-occured-while-trying-to-get-instance-of-type-database- chiave o http://stackoverflow.com/questions/2900403/activation-error-occured-while-trying-to-get-instance-of-type-logwriter –

+0

System.Data.OracleClient.dll è deprecato in .NET 4.0. Ma ODP.NET (Oracle.DataAccess.dll) è supportato in .NET 4.0. La domanda sta usando Oracle.DataAccess.dll 4.112.2.0 e EntLib 5.0. – Kiquenet

risposta

0

Ho avuto lo stesso problema e ho risolto la modifica del pool di applicazioni "Abilita applicazioni a 32 bit" su true.