Frage

Als Anfänger bei NHibernate (2.1.0) versuche ich, meinen ersten Einheitstest mit der berühmten Northwind -Datenbank einzurichten. Der Test lautet so (die Konfigurationsdateien finden Sie am Ende dieser Frage):

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

Das Problem ist, dass list.Count ist immer 0.

  • Ich habe versucht, die Sitzung zu öffnen, indem ich sie meine eigene zur Verfügung stellte IDbConnection, Auf SQL Server 2008, MS Access und SQLite (ich bin positiv zu 100% sicher, dass die Datenbank -Setups und die Verbindungen gültig sind) ohne Erfolg.
  • Ich habe versucht, das generierte SQL im VS2008 -Ausgangsfenster anzuzeigen (siehe Konfigurationsdateien unten in diesem Beitrag), aber nie wird nie angezeigt.

Ich kann zu diesem Zeitpunkt nur vermuten, dass meine Konfiguration falsch ist, aber ich habe keine Ahnung, wie ich sie beheben soll.


  • 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> 
    
War es hilfreich?

Lösung 3

Geschafft !

Es kommt vor, dass ich es intelligent abspielen und die XML -Mapping -Datei als Abhängigkeit der CS -Datei haben wollte. In diesem Fall scheint die eingebettete Ressource den Namen der ersten Klasse in der CS -Datei anstelle des Namens der XML -Datei zu tragen. Ein Bild, das angeblich mehr als tausend Worte wert ist:Solution and Assembly

Also habe ich das geschrieben, um es zum Laufen zu bringen:

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

Lektionen, die es gelernt haben, es zum Laufen zu bringen:

  • Nhibernate beschwert sich in keiner Weise, wenn Sie versuchen, eine Klasse ohne bekannte Zuordnung zu verwenden. Ich bin mir nicht sicher, ob ich das eine Funktion nennen würde ...
  • Bevor Sie eine Sitzung mit Ihrer eigenen öffnen IDbConnection, Öffnen Sie die Verbindung selbst.
  • Sie lernen mehr als Sie beabsichtigt haben, wenn Sie versuchen, klug zu spielen ;-)

Andere Tipps

Mein erster Schritt, um dies zu beheben

Möglicherweise müssen Sie Ihren Appender eher in einen Konsolen -Appender als in eine Ablaufverfolgung ändern.

Zwei Dinge, die Sie auf Ihrem Konfigurationsobjekt wie folgt aufrufen müssen:

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

Dies erwartet eine Datei mit dem Namen hibernate.cfg.xml im selben Verzeichnis. Es gibt eine andere Methode, die Sie anrufen können, um den Namen der Konfigurationsdatei anzugeben, wenn Sie einen anderen Namen haben.

Zweitens müssen Sie NhiberNate mitteilen, wo die Zuordnungsdateien geladen werden soll, die vor dem Erstellen der Fabrik zusammenstellen sollen


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

Schließlich sollten alle Mitglieder Ihrer Kundenklasse virtuell sein, sonst können Sie keine faulen Laden verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top