Тип База данных не может быть построен. Вы должны настроить контейнер для предоставления этого значения (EntLib 5 + ODP.NET)

Я использую ODP.NET и версию 4.1 Enterprise Library по сравнению с 2008 годом. И все в порядке.

Теперь выполните миграцию с использованием ODP.NET Oracle.DataAccess 4.112.2.0 и версии 5.0.414.0 корпоративной библиотеки, по сравнению с 2010, .net 4.0.

Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0

После недавнего обновления Enterprise Library с версии 4.1 до 5.0 мы получаем следующую ошибку:

«База данных типа не может быть создана. Вы должны настроить контейнер для предоставления этого значения».

Microsoft.Practices.ServiceLocation.ActivationException: произошла ошибка активации при попытке получить экземпляр типа Database, ключ «ConnectionStrings.Oracle.xxx» ---> Microsoft.Practices.Unity.ResolutionFailedException: не удалось разрешить зависимость, тип = "Microsoft .Practices.EnterpriseLibrary.Data.Database ", name =" ConnectionStrings.Oracle.xxx ". Исключение произошло во время: при разрешении. Исключение: InvalidOperationException - невозможно создать базу данных типа. Вы должны настроить контейнер для предоставления этого значения.

Ссылки Форум EntLib: http://entlib.codeplex.com/discussions/215290

любое решение по этому поводу ??

моя конфигурация

<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" />

Мой код

 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;

                }
            } 

полная трассировка стека ошибок

Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.GuardTypeIsNonPrimitive (IBuilderContext контекст, SelectedConstructor selectedConstructor) Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp (IBuilderContext контекст) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext контекст) Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlanCreatorPolicy. CreatePlan (контекст IBuilderContext, NamedTypeBuildKey buildKey) Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp (контекст IBuilderContext) Microsoft.Practices.ObjectBuilder2. Имя строки, IEnumerable1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.Resolve (Тип t, имя строки, ResolverOverride [] resolverOverrides) Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance (Тип службы Тип, строковый ключ) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (тип serviceType, строковый ключ) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance (тип serviceType, строковый ключ) Microsoft.Practices.ServiceLocation.ServiceLocatorG Строковый ключ)

ОБНОВИТЬ

этот код работает для меня:

    [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();
        }



    }

Решение: Рэнди Леви (http://entlib.codeplex.com/discussions/215290)

Вы не можете использовать корпоративную библиотеку OracleDatabase с поставщиком Oracle.DataAccess.Client. Встроенный OracleDatabase жестко запрограммирован для использования OracleClientFactory DbProviderFactory, тогда как вы хотите использовать поставщика ODP.NET (Oracle.DataAccess.Client).

Лучший способ - заставить работать EntLibContrib Oracle ODP.NET Data Provider, поскольку он должен поддерживать все, что вам нужно, включая файлы конфигурации.

Поскольку похоже, что вы можете создать DbProviderFactory, вы можете попробовать использовать GenericDatabase с ODP.NET OracleClientFactory, но я предполагаю, что вы столкнетесь с проблемами для определенных функций Oracle (например, refcursor).

Вы можете использовать его напрямую:

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);

person Kiquenet    schedule 13.01.2012    source источник
comment
Быстрая проверка MSDN Post. Штаты However, keep in mind that the OracleClient provider is deprecated in version 4.0 of the .NET Framework, although it is still supported by Enterprise Library. For future development, consider choosing a different Oracle driver.   -  person Amar Palsapure    schedule 13.01.2012
comment
Вы проверили stackoverflow.com/questions/4030436/ или stackoverflow.com/questions/2900403/   -  person Amar Palsapure    schedule 13.01.2012
comment
System.Data.OracleClient.dll устарел в .NET 4.0. Но ODP.NET (Oracle.DataAccess.dll) поддерживается в .NET 4.0. Вопрос в использовании Oracle.DataAccess.dll 4.112.2.0 и EntLib 5.0.   -  person Kiquenet    schedule 13.01.2012
comment
Я использовал EntLib Config Wiz, и когда я добавляю Oracle Connection String, он добавляет <section name="oracleConnectionSettings" type="Microsoft.Practices.EnterpriseLibrary.Data.Oracle.Configuration.OracleConnectionSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> и <oracleConnectionSettings>. Можете ли вы попробовать EntLib Config Wiz?   -  person Amar Palsapure    schedule 13.01.2012


Ответы (2)


Добавить ссылку на

Microsoft.Practices.EnterpriseLibrary.Common
Microsoft.Practices.EnterpriseLibrary.Data
Microsoft.Practices.ServiceLocation

затем используйте эту строку, чтобы получить базу данных:

var database = EnterpriseLibraryContainer.Current.GetInstance<Database>();

Дополнительная информация здесь: http://devstuffs.wordpress.com/2012/03/13/enterprise-library-5-with-odp-net/

person Adauto    schedule 14.03.2012
comment
После этого я все еще получаю сообщение об ошибке. Я также установил 32-разрядную, а затем 64-разрядную версию в сборке и в IIS в соответствии с другим ответом. - person Grault; 19.07.2021

У меня была та же проблема, и я решил изменить пул приложений «Включить 32-разрядные приложения» на true.

person Andres Otálora    schedule 28.02.2017
comment
Если бы это появилось в службе Windows (то есть не специально «Включить 32-битные приложения»). Но это был «код, скомпилированный в 32-битный, на сервере был только 64-битный клиент Oracle». Мы перекомпилировали код в 64-битный, смогли развернуть его на сервере, и это сработало. - person dandarc; 14.01.2021