流畅的NHibernate - 在持久层配置期间发生异常

时间:2009-10-27 13:42:27

标签: c# nhibernate configuration fluent-nhibernate

我正在使用Fluent NHibernate和一个外部'hibernate.cfg.xml'文件。

以下是我收到错误的配置代码:

       var configuration = new Configuration();
       configuration.Configure();

       _sessionFactory = Fluently.Configure(configuration)
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Template>())
                .BuildSessionFactory();

        return _sessionFactory;

但是当NHibernate试图配置时,我得到了错误:

在配置持久层期间发生异常。

内部例外说:

  

未配置ProxyFactoryFactory。   使用一个可用的NHibernate.ByteCode提供程序初始化session-factory配置节的'proxyfactory.factory_class'属性。

我用谷歌搜索,根据我发现的一些解决方案,我做了以下更改:

  1. 将以下dll添加到我的app bin:

    Castle.Core.dll,Castle.DynamicProxy2.dll,NHibernate.ByteCode.Castle.dll

  2. 在hibernate.cfg.xml中添加了follewing属性

    &lt; property name =“proxyfactory.factory_class”&gt; NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle&lt; / property&gt;

  3. 但我仍然得到同样的例外。

10 个答案:

答案 0 :(得分:14)

我也有这个错误。当您不将映射文件(hibernate.cfg.xml)复制到构建目录时,它会触发。

解决方案:

  • 在解决方案资源管理器中,在地图文件 hibernate.cfg.xml 右键单击,选择属性,然后确保< strong>复制到输出目录已选择复制,如果选择较新

答案 1 :(得分:5)

正如Alex InTechno所说,这可能是映射文件定义或映射实体中的错误。当我忘记映射类中的所有属性都必须被定义为虚拟时,我遇到了同样的错误。

public String Name {get;set;}
public virtual String Name { get; set; }

答案 2 :(得分:1)

问题可能在你的hibernate.cfg.xml中,使用2.2版本的双重检查以及是否格式正确。

映射应该像这样开始:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

随着您发布的错误,可能会提供更多信息,因为该错误对于配置解析器来说非常通用。如果没有,也许您可​​以提供有关hibernate.cfg.xml的更多详细信息。

答案 3 :(得分:1)

有潜在原因文本的例外

*数据库未通过数据库方法配置。

可能还会被FluentConfiguration.BuildConfiguration()方法抛出,如果映射错误(即。* Map类未成功解析),并且您已使用.Database()方法配置了数据库。 这有点令人困惑,只能在构建配置的步骤中发现它,而不是从程序集中添加这些类时(通过AddFromAssemblyOf&lt;&gt;)

您可以通过执行一行来检查您的* Map类是否已成功转换为HBM 的 m.FluentMappings.Add(typeof运算(YourMappedTypeMap))ExportTo(@ “C:\ TEMP \ fluentmaps”)。)

答案 4 :(得分:1)

我在Resharper 8.1下的NUnit测试遇到了同样的问题

勾选“ReSharper |选项|工具|单元测试|为每个带有测试的程序集使用单独的AppDomain”复选框修复它

答案 5 :(得分:0)

好吧,我能够通过将.cfg.xml文件放在调用app的bin中来解决该错误。

但现在,我又收到了另一个错误: - (

FluentNHibernate.Cfg.FluentConfigurationException未处理 消息:创建SessionFactory时使用了无效或不完整的配置。检查PotentialReasons集合,以及InnerException以获取更多详细信息。

* 数据库未通过数据库方法配置。

这是我的hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=dev\sql2005;Initial Catalog=TestDB;Integrated Security=True</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration> 

有什么想法吗?

答案 6 :(得分:0)

尝试在App.config中配置数据库,并通过Fluent NHibernate配置映射,我也有一个FluentNHibernateException说

  • 未通过数据库方法配置数据库。

显示详细信息的链接已停用,因此我无法获得任何进一步的信息。搜索几小时我终于发现我的连接字符串有错误(“pasword = xyz;”而不是“password = xyz;”)

答案 7 :(得分:0)

尝试在set_id和set_sampelList中设置受保护的修饰符。例如:

public virtual int Id {
    get; protected set;
}

public virtual IList<Store> StoresStockedIn {
    get; protected set;
}

答案 8 :(得分:0)

我开始收到

*数据库未通过数据库方法配置。

尝试连接到DB / 2数据库时出现

错误消息而未对我的代码进行任何更改。在验证配置文件被复制到构建目录并验证我的XML格式良好并且符合2.2版之后,我终于检查了数据库以确保没有任何更改。

事实证明,连接帐户的密码已过期。它不是无效的,也不是帐户无效 - 密码只是过期了。我不确定为什么过期的密码会出现在这样一个奇怪的错误信息中。

答案 9 :(得分:0)

似乎这个错误可能是一堆不同的东西。我得到了同样的错误,并最终弄清楚这是因为我从项目中排除了一个未使用的视图和映射。不知道这是如何导致错误的,但是一旦我将其添加回来,错误就消失了。