Pergunta

Como iniciante no Nibernate (2.1.0), estou tentando configurar meu primeiro teste de unidade usando o famoso banco de dados Northwind. O teste é assim (os arquivos de configuração podem ser encontrados no final desta pergunta):

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

O problema é que list.Count é sempre 0.

  • Eu tentei abrir a sessão, fornecendo a minha própria IDbConnection, no SQL Server 2008, MS Access e SQLite (estou positivamente 100% seguro de que as configurações do banco de dados e as conexões são válidas) sem sucesso.
  • Eu tentei fazer com que o SQL gerado apareça na janela de saída do VS2008 (consulte os arquivos de configuração na parte inferior desta postagem), mas nada aparece.

Só posso adivinhar nesta fase que minha configuração está incorreta, mas não tenho idéia de como corrigi -la.


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

Solução 3

Acertou em cheio !

Acontece que eu queria reproduzi -lo inteligente e ter o arquivo de mapeamento XML como uma dependência do arquivo CS. Nesse caso, o recurso incorporado parece suportar o nome da primeira classe contida no arquivo CS em vez do nome do arquivo XML. Uma imagem supostamente vale mais que mil palavras:Solution and Assembly

Então, eu escrevi isso para fazer funcionar:

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

Lições aprendidas para fazer o funcionamento:

  • O Nibernate não reclamará de forma alguma quando você tentar usar uma aula sem mapeamento conhecido. Não tenho certeza se chamaria isso de recurso ...
  • Antes de abrir uma sessão com o seu próprio IDbConnection, abra a própria conexão.
  • Você aprende mais do que pretendia ao tentar jogar inteligente ;-)

Outras dicas

Meu primeiro passo para solucionar problemas disso seria perguntar o que o SQL está sendo gerado pela sua chamada e depois tentar executá -lo contra o banco de dados alvo e ver quais resultados você obtém

Pode ser necessário alterar seu Appender para um Appender de console em vez de rastrear.

Duas coisas que você precisa chamar de configuração em seu objeto de configuração como este:

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

Isso espera um arquivo chamado hibernate.cfg.xml no mesmo diretório. Há outro método que você pode ligar para especificar o nome do arquivo de configuração, se você tiver outro nome.

Segundo, você precisa dizer a Nibernate onde carregar os arquivos de mapeamento, qual montagem antes de criar a fábrica


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

Finalmente, todos os membros da sua classe de clientes devem ser virtuais, caso contrário, você não pode usar o carregamento preguiçoso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top