database 无法构造类型数据库。您必须配置容器以提供此值 (EntLib 5 + ODP.NET)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8847744/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
The type Database cannot be constructed. You must configure the container to supply this value (EntLib 5 + ODP.NET)
提问by Kiquenet
I use ODP.NET and version 4.1 of the Enterprise Library, vs 2008. And all is OK.
我使用 ODP.NET 和 4.1 版企业库,与 2008 年相比。一切正常。
Now, migrate using ODP.NET Oracle.DataAccess 4.112.2.0 and version 5.0.414.0 of the Enterprise Library, vs 2010, .net 4.0.
现在,使用 ODP.NET Oracle.DataAccess 4.112.2.0 和 Enterprise Library 5.0.414.0 版进行迁移,而 2010 年则是 .net 4.0。
Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0
Oracle.DataAccess 4.112.2.0 EnterpriseLibrary 5.0.414.0
Following a recent upgrade from version 4.1 to 5.0 of the Enterprise Library, once we get the following error:
在最近从 Enterprise Library 的 4.1 版升级到 5.0 版之后,一旦我们收到以下错误:
"The type Database cannot be constructed. You must configure the container to supply this value."
“无法构建类型数据库。您必须配置容器以提供此值。”
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.
Microsoft.Practices.ServiceLocation.ActivationException:尝试获取数据库类型的实例时发生激活错误,键为“ConnectionStrings.Oracle.xxx”---> Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 =“Microsoft .Practices.EnterpriseLibrary.Data.Database”,名称=“ConnectionStrings.Oracle.xxx”。异常发生时:解决时。异常是: InvalidOperationException - 无法构造类型数据库。您必须配置容器以提供此值。
References EntLib Forum: http://entlib.codeplex.com/discussions/215290
参考 EntLib 论坛:http://entlib.codeplex.com/discussions/215290
any solution about it ??
有什么解决办法吗??
my config
我的配置
<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;
}
}
full error 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, IEnumerable1 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)
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.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext context) Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context, SelectedConstructor selectedConstructor) Microsoft..Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp(IBuilderContext context) 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,字符串名称,IEnumerable
1 resolverOverrides) Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable1 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(键入 serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService](String key)
UPDATE
更新
this code works for 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();
}
}
Solution: by Randy Levy (http://entlib.codeplex.com/discussions/215290)
解决方案:Randy Levy ( http://entlib.codeplex.com/discussions/215290)
You can't use the Enterprise Library OracleDatabase with the Oracle.DataAccess.Client provider. The built in OracleDatabase is hardcoded to use the OracleClientFactory DbProviderFactory whereas you want to use the ODP.NET provider (Oracle.DataAccess.Client).
您不能将企业库 OracleDatabase 与 Oracle.DataAccess.Client 提供程序一起使用。内置的 OracleDatabase 被硬编码为使用 OracleClientFactory DbProviderFactory 而您想要使用 ODP.NET 提供程序 (Oracle.DataAccess.Client)。
The best way is to get the EntLibContrib Oracle ODP.NET Data Provider working since it should support everything that you need including configuration files.
最好的方法是让 EntLibContrib Oracle ODP.NET 数据提供程序工作,因为它应该支持您需要的一切,包括配置文件。
Since it looks like you can create the DbProviderFactory you could try to use a GenericDatabase with the ODP.NET OracleClientFactory but I would guess that you would run into issues for specific Oracle functionality (e.g. refcursor).
由于看起来您可以创建 DbProviderFactory,因此您可以尝试将 GenericDatabase 与 ODP.NET OracleClientFactory 一起使用,但我猜您会遇到特定 Oracle 功能(例如 refcursor)的问题。
You could use it directly:
你可以直接使用它:
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);
采纳答案by Adauto
Add a reference to
添加引用
Microsoft.Practices.EnterpriseLibrary.Common
Microsoft.Practices.EnterpriseLibrary.Data
Microsoft.Practices.ServiceLocation
then use this line to get the database:
然后使用这一行来获取数据库:
var database = EnterpriseLibraryContainer.Current.GetInstance<Database>();
More info here: http://devstuffs.wordpress.com/2012/03/13/enterprise-library-5-with-odp-net/
更多信息:http: //devstuffs.wordpress.com/2012/03/13/enterprise-library-5-with-odp-net/
回答by Andres Otálora
I had the same problem and resolve changing the Application Pool "Enable 32 bit Applications" to true.
我遇到了同样的问题并解决了将应用程序池“启用 32 位应用程序”更改为 true 的问题。

