Question

En tant que débutant sur NHibernate (2.1.0), je suis en train de mettre en place mon premier test de l'unité en utilisant la célèbre base de données Northwind. Le test va comme ceci (les fichiers de configuration se trouvent à la fin de cette question):

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

Le problème est que list.Count est toujours 0.

  • J'ai essayé d'ouvrir la session en lui fournissant mon propre IDbConnection, sur Sql Server 2008, MS Access et SQLite (je suis 100% sûr positivement que les configurations de base de données et les connexions sont valides) sans succès.
  • J'ai essayé de faire le SQL généré apparaissent sur la fenêtre de sortie de VS2008 (voir les fichiers config au bas de ce post), mais rien ne montre jamais baisser les bras.

Je ne peux que deviner à ce stade que ma configuration est incorrecte, mais je ne sais pas comment le résoudre.


  • 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> 
    
Était-ce utile?

La solution 3

Cloué lui!

Il arrive que je voulais jouer intelligemment et le fichier de mappage XML comme une dépendance du fichier CS. Dans ce cas, la ressource incorporée semble porter le nom de la première classe contenue dans le fichier CS à la place du nom du fichier XML. Une image étant soi-disant vaut mille mots: Solution et l

Alors j'ai écrit cela pour le faire fonctionner:

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

Les leçons apprises à l'obtenir au travail:

  • NHibernate ne se plaindra pas de quelque façon que lorsque vous essayez d'utiliser une classe sans correspondance connue. Je ne suis pas sûr que je qualifierais qu'une fonction ...
  • Avant d'ouvrir une session avec votre propre IDbConnection, ouvrez la connexion elle-même.
  • Vous apprendrez plus que vous vouliez en essayant de jouer intelligemment; -)

Autres conseils

Ma première étape pour résoudre ce serait de demander ce que sql est généré par votre appel et tenter ensuite d'exécuter que contre la db cible et voir ce que vous obtenez les résultats

Vous devrez peut-être changer votre appender une appender console plutôt que trace.

deux choses que vous devez appeler configurer sur votre objet de configuration comme ceci:

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

attendre un fichier nommé hibernate.cfg.xml dans le même répertoire. Il y a une autre méthode que vous pouvez appeler pour indiquer le nom du fichier de configuration si vous avez un autre nom.

Ensuite, vous devez dire NHibernate où charger les fichiers de mappage, qui l'assemblage avant de créer l'usine


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

Enfin, tous les membres de votre classe client devrait être virtuel autre que vous ne pouvez pas utiliser le chargement paresseux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top