簡體   English   中英

NHibernate映射錯誤([EntityName]未映射)

[英]NHibernate mapping error ([EntityName] not mapped)

我的項目(c#,nhibernate,npgsql,nlog)有一個名為Entry實體,應該映射到名為test的數據庫表中。 該表包含一些測試條目。

我的應用程序代碼如下:

public void work()
{
    ISessionFactory sessions = new Configuration().Configure().BuildSessionFactory();
    ISession session = sessions.OpenSession();

    IList<Entry> entries = session.CreateQuery("from Entry").List<Entry>();

    foreach (Entry e in entries)
    {
        logger.Debug("Entry: " + e.id + " with " + e.name);
    }
}

Entry實體如下所示:

namespace pgsql
{
    class Entry
    {
        public virtual int id { get; set; }
        public virtual string name { get; set; }
    }
}

我的NHibernate配置的結構如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
        <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="default_catalog">test</property>
        <property name="default_schema">test</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <property name="connection.connection_string">server=localhost;database=*****;uid=*****;pwd=*****;</property>
    </session-factory>
</hibernate-configuration>

Entry實體配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping schema="test" xmlns="urn:nhibernate-mapping-2.2">
    <class name="Entry" table="test">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
    </class>
</hibernate-mapping>

這引發以下錯誤:

條目未映射[來自條目]

我已經確定,Visual Studio hbm.xml所有hbm.xml文件復制到輸出目錄。 我想念什么?

根據您的答案進行編輯:

解決方案是使用Assembly進行初始化:

 ISessionFactory sessions = new Configuration().Configure().AddAssembly(Assembly.GetExecutingAssembly()).BuildSessionFactory(); 

但我仍然不知道為什么要這樣。

我將解釋為什么必須這樣。

您的實體與應用程序在同一程序集中定義。
當您調用Configuration().Configure().BuildSessionFactory() ,實際上所有的HBM文件都將被忽略。 您需要執行以下任一操作才能將HBM文件添加到Configuration實例:

  • 對每個單獨的HBM文件使用new Configuration().AddFile("MyFile.hbm.xml")
  • 使用new Configuration().Configure().AddAssembly(YourAssembly())告訴NHibernate 查找所有HBM文件並為您添加所有這些文件。
  • 下面鏈接的文檔中提到的其他方式。

由於您既沒有執行任何操作,也沒有向Configuration添加任何實體Configuration 乳清您嘗試運行您的HQL查詢時,NHibernate正在尋找未定義的Entry實體(已添加到Configuration )。 因此是錯誤。

正如您在答案中提到的那樣,您選擇了將HBM文件添加到Configuration第二種方法,並且問題消失了。

另一種替代方法(可能是最好的方法)是讓NHibernate加載Assembly中包含的所有映射文件:

 Configuration cfg = new Configuration() .AddAssembly( "NHibernate.Auction" ); 

然后,NHibernate將在程序集中查找以.hbm.xml結尾的任何資源。 這種方法消除了任何硬編碼的文件名,並確保添加了程序集中的映射文件。

請參閱文檔以獲取更多詳細信息。


原始答案

實體名稱也應包括名稱空間。

IList<Entry> entries = session.CreateQuery("from pgsql.Entry").List<Entry>();

為了簡化重構,您還可以更改為以下內容:

var queryString = string.Format("from {0}", typeof(Entry));
IList<Entry> entries = session.CreateQuery(queryString).List<Entry>();

請參閱第14.2 docs 的from子句

這不是問題的一部分,但是,調用BuildSessionFactory的代價BuildSessionFactory 您不需要重復它。 您可以在應用程序啟動時調用它,並維護ISessionFactory實例以供將來使用。

解決方案是使用Assembly進行初始化:

ISessionFactory sessions = new Configuration().Configure().AddAssembly(Assembly.GetExecutingAssembly()).BuildSessionFactory();

但我仍然不知道為什么要這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM