Я использую 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. Имя строки, IEnumerable
1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable
1 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);
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<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