Pergunta

Agora, antes que você diga:EU fez Google e meu hbm.xml arquivo é um recurso incorporado.

Aqui está o código que estou chamando:

ISession session = GetCurrentSession();
var returnObject =  session.Get<T>(Id);

Aqui está meu arquivo de mapeamento para a classe:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
    <id name="ID" column="ID" unsaved-value="0">
      <generator class="identity" />
    </id>

    <property name="Name" column="Name" />
    <property name="NumberOfBuckets" column="NumberOfBuckets"  />
    <property name="SearchCriteriaOne" column="SearchCriteriaOne" />

    <bag name="_Businesses" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many 
         class="HQData.Objects.Business, HQData"/>
    </bag>

    <bag name="_Buckets" cascade="all">
      <key column="SubCategoryId"/>
      <one-to-many
         class="HQData.Objects.Bucket, HQData"/>
    </bag>

  </class>
</hibernate-mapping>

Alguém já se deparou com esse problema antes?

Aqui está a mensagem de erro completa:

MappingException: No persister for:  HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Event\Default\DefaultLoadEventListener.cs:37 NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:2054 NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1029 NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:1020 NHibernate.Impl.SessionImpl.Get(Object id)
 in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionImpl.cs:985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject(Int32 Id)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQData\DataAccessUtils\NHibernateObjectHelper.cs:42 HQWebsite.LocalSearch.get_subCategory()
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:17 HQWebsite.LocalSearch.Page_Load(Object sender, EventArgs e)
 in C:\Development\HQChannelRepo\HQ Channel Application\HQChannel\HQWebsite\LocalSearch.aspx.cs:27 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +47 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436

Atualizar, aqui está a solução para meu cenário foi:Eu havia alterado algum código e não estava adicionando o Assembly ao arquivo de configuração durante o tempo de execução.

Foi útil?

Solução

Parece que você esqueceu de adicionar um assembly de mapeamento à configuração de fábrica da sessão.

Se você estiver usando app.config...

.
.
    <property name="show_sql">true</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="Project.DomainModel"/>  <!-- Here -->
</session-factory>
.
.

Outras dicas

Algo óbvio, mas bastante útil para alguém novo no NHibernate.

Todos os arquivos de mapeamento XML devem ser tratados como Recursos incorporados em vez do padrão Contente.Esta opção é definida editando o atributo Build Action nas propriedades do arquivo.

Os arquivos XML são então incorporados ao assembly e analisados ​​na inicialização do projeto durante a fase de configuração do NHibernate.

Meu problema foi que esqueci de colocar .hbm no nome do xml de mapeamento.Certifique-se também de torná-lo um recurso incorporado!

Eu tirei isso de aqui:

No meu caso, a classe de mapeamento não era pública.Em outras palavras, em vez de:

public class UserMap : ClassMap<user>  // note the public!

Eu só tive:

class UserMap : ClassMap<user>

Passar cerca de 4 horas pesquisando no Google e estouro de pilha, tentando todas as coisas por aí, encontrei meu erro:

Meu arquivo de mapeamento foi chamado .nbm.xml em vez de .hbm.xml.Isso foi uma loucura.

Eu tive um problema semelhante e resolvi da seguinte maneira:

Estou trabalhando no MS SQL 2008, mas na configuração do NH tive um dialeto ruim:NHibernate.Dialeto.Dialeto MsSql2005se eu corrigir para:NHibernate.Dialeto.Dialeto MsSql2008então tudo está funcionando bem, sem exceção "Sem persistência para:... "David.

Eu também estava adicionando o assembly errado durante a inicialização.A classe que estou persistindo está no assembly nº 1 e meu arquivo .hbm.xml está incorporado no assembly nº 2.eu mudei cfg.AddAssembly(... para adicionar a montagem nº 2 (em vez da montagem nº 1) e tudo funcionou.Obrigado!

Para complementar a resposta do Amol, não cometa o erro de especificar o tipo de classe Interface. Certifique-se de especificar a classe de implementação.(ou seja.não use IDomainObjectType).Não que eu tenha cometido esse erro...:)

Deveria ser name="Id"?Erros de digitação são uma causa provável.

O próximo passo seria testá-lo com um teste não genérico para ter certeza de que você está passando o parâmetro de tipo adequado.

Você pode postar a mensagem de erro inteira?

Eu tive o mesmo problema porque estava adicionando o assembly errado no método Configuration.AddAssembly().

Este erro ocorre devido à configuração de mapeamento inválida.Você deve verificar onde definiu .Mappings para sua fábrica de sessões.Basicamente, pesquise ".Mappings(" em seu projeto e certifique-se de especificar a classe de entidade correta na linha abaixo.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<YourEntityClassName>())

Se estiver executando testes no repositório a partir de um assembly separado, certifique-se de que seu Hibernate.cfg.xml esteja configurado para saída sempre no diretório bin desse assembly.Isso não estava acontecendo conosco e recebemos o erro acima em determinadas circunstâncias.

Isenção de responsabilidade:Este pode ser um conselho um pouco esotérico, visto que é um resultado direto de como estruturamos nossos assemblies de teste de integração de repositório (ou seja,temos um link simbólico de cada assembly de teste para um único Hibernate.xfg.xml)

Não se esqueça de especificar as informações de mapeamento no arquivo .config

por exemplo.

onde MyApp.Data é o assembly que contém seus mapeamentos

Tive um problema semelhante ao encontrar um objeto por id ...Tudo o que fiz foi usar o nome totalmente qualificado no nome da classe.Isso é antes de ser:

find("Class",id)

Objeto então ficou assim:

find("assemblyName.Class",id)

Certifique-se de ter ligado para o CreateCriteria(typeof(DomainObjectType)) método na sessão para o objeto de domínio que você pretende buscar no banco de dados.

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