Agora, antes que você diga: eu fiz o 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á o 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á correu para esse problema antes?
Aqui está a mensagem de erro completa:
MappingException: sem persister para: HQData.Objects.SubCategory] NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName, Boolean throwIfNotFound) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 766 NHibernate.Impl.SessionFactoryImpl.GetEntityPersister (String entityName) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionFactoryImpl.cs: 752 NHibernate.Event.Default.DefaultLoadEventListener.OnLoad (evento LoadEvent, LoadType loadType) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Evento \ Padrão \ DefaultLoadEventListener.cs: 37 NHibernate.Impl.SessionImpl.FireLoad (evento LoadEvent, LoadType loadType) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 2054 NHibernate.Impl.SessionImpl.Get (String entityName, ID do objeto) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1029 NHibernate.Impl.SessionImpl.Get (Tipo entityClass, ID do objeto) em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 1020 NHibernate.Impl.SessionImpl.Get (ID do objeto) Em c: \ CSharp \ NH2.0.0 \ nhibernate \ src \ NHibernate \ Impl \ SessionImpl.cs: 985 HQData.DataAccessUtils.NHibernateObjectHelper.LoadDataObject (ID de Int32) em C: \ Desenvolvimento \ HQChannelRepo \ Aplicativo de canal HQ \ HQChannel \ HQData \ DataAccessUtils \ NHibernateObjectHelper.cs: 42 HQWebsite.LocalSearch.get_subCategory () em C: \ Development \ HQChannelRepo \ Aplicativo de canal HQ \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 17 HQWebsite.LocalSearch.Page_Load (remetente do objeto, EventArgs e) em C: \ Development \ HQChannelRepo \ Aplicativo de canal HQ \ HQChannel \ HQWebsite \ LocalSearch.aspx.cs: 27 System.Web.Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Objeto o, Objeto t, EventArgs e) +15 System.Web .Util.CalliEventHandlerDelegateProxy.Callback (Remetente do objeto, 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
Atualização , eis a solução para o meu cenário: eu havia alterado algum código e não estava adicionando o Assembly ao arquivo de configuração durante o tempo de execução.
c#
.net
nhibernate
Sara Chipps
fonte
fonte
Respostas:
Parece que você esqueceu de adicionar um conjunto de mapeamento à configuração de fábrica da sessão.
Se você estiver usando o app.config ...
fonte
Algo óbvio, mas bastante útil para alguém novo no NHibernate.
Todos os arquivos de mapeamento XML devem ser tratados como recursos incorporados, e não como o conteúdo padrão . Esta opção é configurada editando o atributo Build Action nas propriedades do arquivo.
Os arquivos XML são incorporados ao assembly e analisados na inicialização do projeto durante a fase de configuração do NHibernate.
fonte
Embedded resource
, mas quando o copiei de um computador para outro, o arquivo perdeu essa propriedade. Cocei minha cabeça por alguns bons minutos.Meu problema foi que esqueci de colocar o .hbm no nome do xml de mapeamento. Também certifique-se de torná-lo um recurso incorporado!
fonte
Eu tirei isso daqui :
No meu caso, a classe de mapeamento não era pública. Em outras palavras, em vez de:
Eu só tinha:
fonte
Gastando cerca de 4 horas de googling e stackoverflowing , tentando tudo de coisas por lá, eu encontrei o meu erro:
Meu arquivo de mapeamento foi chamado .nbm.xml em vez de .hbm.xml . Isso foi insano.
fonte
Eu tive um problema semelhante e resolvi como a seguir:
Eu estou trabalhando no MS SQL 2008, mas na configuração do NH eu tinha um dialeto ruim: NHibernate.Dialect. MsSql2005Dialect se eu corrigi-lo para: NHibernate.Dialect. MsSql2008Dialect , tudo está funcionando bem, sem uma exceção "Não persiste para: ..." David.
fonte
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. Mudei
cfg.AddAssembly(...
para adicionar a montagem nº 2 (em vez da montagem nº 1) e tudo funcionou. Obrigado!fonte
Para adicionar à resposta da 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 cometi esse erro ... :)
fonte
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 garantir que você está passando no parâmetro de tipo apropriado.
Você pode postar a mensagem de erro inteira?
fonte
Eu tive o mesmo problema porque estava adicionando o assembly errado no método Configuration.AddAssembly ().
fonte
Este erro ocorre devido à configuração de mapeamento inválida. Você deve verificar onde definiu .Mappings para sua fábrica de sessões. Pesquise basicamente ".Mappings (") no seu projeto e verifique se especificou a classe de entidade correta na linha abaixo.
fonte
Se estiver executando testes no repositório a partir de um assembly separado, verifique se o Hibernate.cfg.xml está definido para saída sempre no diretório bin do referido assembly. Isso não estava acontecendo para nós e recebemos o erro acima em determinadas circunstâncias.
Isenção de responsabilidade: este pode ser um conselho um pouco esotérico, já que é um resultado direto de como estruturamos nossos conjuntos de teste de integração de repositório (ou seja, temos um link simbólico de cada conjunto de teste para um único Hibernate.xfg.xml)
fonte
Não se esqueça de especificar informações de mapeamento no arquivo .config
por exemplo
onde MyApp.Data é um assembly que contém seus mapeamentos
fonte
Teve um problema semelhante ao encontrar um objeto por id ... Tudo o que fiz foi usar o nome completo no nome da classe. Isso é Antes de ser:
Objeto, tornando-se assim:
fonte
Certifique-se de ter chamado o
CreateCriteria(typeof(DomainObjectType))
método na sessão para o objeto de domínio que você deseja buscar no banco de dados.fonte
Eu tenho um problema semelhante, mas todos os requisitos mencionados são atendidos. No meu caso, tento salvar alguma classe de entidade (Type of OBJEKTE) de volta no banco de dados. Outros locais funcionam, mas somente nesse caso ele falha e gera essa exceção.
Minha solução (HACK) foi mapear novamente o objeto do tipo OBJEKTE novamente e armazená-lo. De repente, funciona. Mas não pergunte o porquê.
Se o inparam for direto para UpdateAsync (), ele não poderá encontrar um persistente correspondente.
Isso poderia ser explicado pela maneira como a NH faz isso. Deriva um proxy da sua classe de mapeamento e implementa as propriedades com manipulação suja incluída. Veja isso:
O mais engraçado é que a fonte de
inparam
fato é o próprio repositório NH. Enfim. Eu fico com esse hack de redesignação pela próxima vez.fonte