0

NHibernate (2.1.0) の初心者として、有名な Northwind データベースを使用して最初の単体テストをセットアップしようとしています。テストは次のようになります (構成ファイルはこの質問の最後にあります)。

ISessionFactory sessionFactory=new Configuration().BuildSessionFactory();
ISession session=sessionFactory.OpenSession();
IList<Customer> list=session.CreateCriteria<Customer>().List<Customer>();
Assert.AreEqual(91, list.Count);

問題は、それlist.Countが常に 0 であることです。

  • IDbConnectionSql Server 2008、MS Access、および SQLite で独自のセッションを開こうとしましたが(データベースのセットアップと接続が有効であることを 100% 確信しています)、役に立ちませんでした。
  • 生成された SQL を VS2008 の出力ウィンドウに表示しようとしましたが (この投稿の下部にある構成ファイルを参照)、何も表示されません。

この段階では、構成が間違っているとしか推測できませんが、修正方法がわかりません。


  • App.config :

    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <session-factory>
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
        <property name="connection.connection_string">Data Source=S:\Work\SVN\src\Northwind\SQL\Northwind.db</property>
        <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
        <property name="show_sql">true</property>
      </session-factory>
    </hibernate-configuration>
    <log4net>
      <appender name="DebugSQL" type="log4net.Appender.TraceAppender">
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="DEBUG" />
        <appender-ref ref="DebugSQL" />
      </root>
    </log4net>
    
  • Customer.cs :

    namespace Northwind.DomainModel.NHibernate
    {
        public class Customer
        {
            public string CustomerID { get; set; }
            public string CompanyName { get; set; }
            public string ContactName { get; set; }
            public string ContactTitle { get; set; }
            public string Address { get; set; }
            public string City { get; set; }
            public string Region { get; set; }
            public string PostalCode { get; set; }
            public string Country { get; set; }
            public string Phone { get; set; }
            public string Fax { get; set; }
        }
    }
    
  • Customer.hbm.xml :

    <hibernate-mapping
      xmlns="urn:nhibernate-mapping-2.2"
      assembly="Northwind.DomainModel"
      namespace="Northwind.DomainModel.NHibernate"
    >
      <class name="Customer" table="Customers">
        <id name="CustomerID" column="CustomerID" type="String" length="5">
          <generator class="assigned" />
        </id>
        <property name="CompanyName" />
        <property name="ContactName" />
        <property name="ContactTitle" />
        <property name="Address" />
        <property name="City" />
        <property name="Region" />
        <property name="PostalCode" />
        <property name="Country" />
        <property name="Phone" />
        <property name="Fax" />
      </class>
    </hibernate-mapping> 
    
4

3 に答える 3

0

次のように、構成オブジェクトでconfigureを呼び出す必要がある2つのこと:

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

これは、同じディレクトリにHibernate.cfg.xmlという名前のファイルが存在することを前提としています。別の名前がある場合は、構成ファイルの名前を指定するために呼び出すことができる別のメソッドがあります。

次に、ファクトリを作成する前に、マッピングファイルをロードする場所をNHibernateに指示する必要があります。


configuration.AddAssembly(typeof(Customer).Assembly); //if in same assembly with  customer class

最後に、顧客クラスのすべてのメンバーは仮想である必要があります。そうでない場合、遅延読み込みを使用できません。

于 2009-09-23T08:19:12.583 に答える
0

ばっちり成功 !

スマートにプレイして、XML マッピング ファイルを CS ファイルの依存関係として持ちたいと思ったことがあります。この場合、埋め込まれたリソースは、XML ファイルの名前ではなく、CS ファイルに含まれる最初のクラスの名前を持っているように見えます。おそらく千の言葉に値する画像: ソリューションとアセンブリ

だから私はそれを機能させるためにこれを書きました:

ISessionFactory sessionFactory=new Configuration()
    .Configure()
    .AddResource(typeof(Customer).FullName, typeof(Customer).Assembly)
    .BuildSessionFactory();

それを機能させるために学んだ教訓:

  • 既知のマッピングを持たないクラスを使用しようとしても、NHibernate は文句を言いません。それを機能と呼ぶかどうかはわかりません...
  • 独自の でセッションを開く前にIDbConnection、接続自体を開きます。
  • スマートにプレイしようとすると、意図したよりも多くのことを学びます;-)
于 2009-09-23T13:06:19.523 に答える
0

これをトラブルシューティングするための最初のステップは、呼び出しによってどの SQL が生成されているかを確認し、それをターゲット データベースに対して実行して、どのような結果が得られるかを確認することです。

トレースではなく、コンソール アペンダーにアペンダーを変更する必要がある場合があります。

于 2009-09-23T08:13:52.380 に答える