Domanda

Come un principiante in NHibernate (2.1.0), sto cercando di impostare il mio primo test unità utilizzando il famoso database Northwind. Il test va come questo (i file di configurazione si trovano alla fine di questa domanda):

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

Il problema è che list.Count è sempre 0.

  • Ho cercato di aprire la sessione, fornendo la mia propria IDbConnection, in SQL Server 2008, MS Access e SQLite (io sono positivamente al 100% che il setup del database e le connessioni sono validi) senza alcun risultato.
  • Ho cercato di rendere il codice SQL generato compare sulla finestra di output VS2008 (vedi file di configurazione in fondo a questo post), ma niente rivela mai in su.

Posso solo immaginare in questa fase che la mia configurazione è corretta, ma non ho idea di come risolvere il problema.


  • 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> 
    
È stato utile?

Soluzione 3

inchiodato!

Succede che volevo giocare intelligente e avere il file di mapping XML come una dipendenza del file CS. Nel qual caso la risorsa incorporata sembra di portare il nome della prima classe contenuta nel file CS invece del nome del file XML. Un'immagine essendo presumibilmente vale più di mille parole: Soluzione e montaggio

Così ho scritto questo per farlo funzionare:

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

Le lezioni apprese a farla funzionare:

  • NHibernate non si lamenterà in alcun modo quando si tenta di utilizzare una classe senza mappatura nota. Non sono sicuro che chiamerei che una caratteristica ...
  • Prima di aprire una sessione con il proprio IDbConnection, aprire la connessione stessa.
  • Si impara più di quanto previsto a quando si cerca di riprodurre intelligenti; -)

Altri suggerimenti

Il mio primo passo per la risoluzione dei problemi sarebbe quello di chiedere che cosa SQL che viene generato dalla vostra chiamata e quindi si tenta di eseguire quella contro il db di destinazione e vedere quali risultati si ottiene

Potrebbe essere necessario cambiare il tuo appender ad un appender console piuttosto che lasciare traccia.

due cose che dovete chiamare configurare sul proprio oggetto di configurazione in questo modo:

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

questo si aspettano un file chiamato hibernate.cfg.xml nella stessa directory. C'è un altro metodo è possibile chiamare per specificare il nome del file di configurazione se si dispone di un altro nome.

In secondo luogo è necessario indicare NHibernate dove caricare i file di mapping, che il montaggio prima di creare la fabbrica


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

Infine tutti i membri della tua classe il cliente dovrebbe essere virtuale, altrimenti non è possibile utilizzare lazy loading.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top