Problem bei der Zuordnung des Northwind -Kunden mit NhiberNate
-
13-09-2019 - |
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>
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:
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.