Pregunta

Como un principiante en NHibernate (2.1.0), que estoy tratando de configurar mi primera prueba de la unidad utilizando la famosa base de datos Neptuno. La prueba es la siguiente (los archivos de configuración se pueden encontrar al final de esta pregunta):

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

El problema es que list.Count es siempre 0.

  • He tratado de abrir la sesión dotándolo mi propia IDbConnection, en SQL Server 2008, MS Access y SQLite (soy positiva 100% seguro de que las configuraciones de bases de datos y las conexiones son válidas) en vano.
  • He intentado que el SQL generado aparece en la ventana de salida VS2008 (ver archivos de configuración en la parte inferior de este post), pero nada se muestra arriba.

Sólo puedo imaginar en este momento que mi configuración no es correcta, pero no tengo ni idea de cómo solucionarlo.


  • 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> 
    
¿Fue útil?

Solución 3

perfeccionado!

Sucede que quería jugar de manera inteligente y tener el archivo de asignación XML como una dependencia del archivo de CS. En cuyo caso el recurso incrustado parece llevar el nombre de la primera clase contenida en el archivo de CS en lugar del nombre del archivo XML. Una imagen de ser supuestamente vale más que mil palabras: Soluci&oacute;n y montaje

Así que escribió esto para conseguir que funcione:

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

Las lecciones aprendidas en conseguir que funcione:

  • NHibernate no se quejará de ninguna manera cuando intenta utilizar una clase con ninguna asignación conocida. No estoy seguro de que yo llamaría que una característica ...
  • Antes de abrir una sesión con su propio IDbConnection, abrir la conexión en sí.
  • Se aprende más de lo previsto para cuando se trata de jugar de manera inteligente; -)

Otros consejos

Mi primer paso para solucionar este sería pedir lo que SQL se está generando por su llamada y luego intenta la ejecución que en contra de la db de destino y ver los resultados que obtiene

Es posible que tenga que cambiar su appender a un appender consola en lugar de dejar rastro.

dos cosas que hay que llamar a configurar en el objeto de configuración de la siguiente manera:

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

Este esperar un archivo llamado hibernate.cfg.xml en el mismo directorio. Hay otro método que se puede llamar para especificar el nombre del archivo de configuración si tiene otro nombre.

En segundo lugar es necesario decirle NHibernate dónde cargar los archivos de mapeo, que la asamblea antes de la creación de la fábrica


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

Finalmente todos los miembros de la clase de cliente debe ser virtual de lo contrario no puede utilizar la carga diferida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top