Problème dans la cartographie Northwind client avec NHibernate
-
13-09-2019 - |
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>
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:
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.