在尝试获取类型为Database的实例时发生激活错误,关键字为空。

11

我正在尝试使用Enterprise Library 5.0,并对我的业务逻辑进行一些单元测试,我需要在数据访问层(DL)或测试项目上有一个app.config吗?

注意:我已经在Web项目的web.config中拥有配置设置。

我如何使用DAAB:

private static Database db = DatabaseFactory.CreateDatabase();

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

我的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>

配置文件应该放在测试项目中,但我不确定这是否可行。你使用的是什么测试框架? - Pieter van Ginkel
1
是的,我自己发现我引用了错误的.dll副本。现在它可以工作了,感谢您的帮助。 - Martin Ongtangco
马丁,你最好发布一个回答你的问题,然后接受它。 - Randy Levy
7个回答

3
为了添加其他原因。
我有一个VS2010解决方案/csproj,引用Enterprise Library 5.0.xxxxx。
然而,csproj被设置为"目标3.5框架"。因此,我需要将目标框架定位到4.0,或者使用Enterprise Library的3.5版本。
我成功地将目标框架更新为4.0,然后错误就消失了。
以下是您可以执行的操作,以确定代码编译的框架版本: (Powershell迷你脚本)
[System.Reflection.Assembly]::LoadFrom("c:\somefolder\Any_Of_The_Practices.dll").ImageRuntimeVersion

如果你得到的是v2.0.50727版本,那么在Framework 4.0(或更高版本)下运行会出现问题。
编辑:
我也因为没有正确定义“DbProviderFactories”而遇到了这个错误。 我在以下网址找到了一个MySQL配置: (我复制了它,以防该URL在将来失效)
(来自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>

最后一点:
我曾经因为配置文件中没有与defaultDatabase值相同的ConnectionString而遇到了这个错误,也就是所谓的“傻瓜”错误。
如果您愿意,可以在创建数据库之前添加这个安全阀门代码。
        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));
                }
            }
        }

1

这是由于GAC dll(程序集中的Dll)与应用程序引用的dll之间的dll不匹配所致。

从程序集中删除dll并尝试运行。

  1. 开始-->运行
  2. 键入程序集
  3. 删除发生激活错误的dll。
  4. 重置IIS

希望这能解决您的问题。


0

由于类库可以拥有app.config文件,当您使用EntLib 5.0并希望在类库中访问连接字符串时,这并不是很有帮助。因此,您需要将上述配置添加到您解决方案中使用的所有web.config文件中。例如,如果您有UI层、Business(类库)和UI层之间的WCF层以及Business层位于WCF服务和DAL(类库)之间。

在这里,每个UI层和WCF服务层都将有一个web.config文件,因此这两个web.config文件应包含上述设置。


0

我遇到了同样的问题,但是我通过将EntLib从5.0更改为3.1来解决它。


0

我引用了错误的.dll文件副本。现在它可以工作了。


0

-2

我通过在CreateDatabase调用中显式指定连接字符串的名称来修复了DLL项目中的此错误,如下所示:

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

替代

Database db = DatabaseFactory.CreateDatabase();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接