2015-06-11 14 views
2

Просмотрели 4 сообщения stackoverflow по той же проблеме, но не смогли найти решение.NHibernate.Mapping Exception. Нет persister для Namespace.className

Моя основная программа:

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Collections; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using NHibernate; 
using NHibernate.Cfg; 
using NHibernate.Cfg.MappingSchema; 
using NHibernate.Dialect; 

namespace NhibernateORM 
{ 
    public class Layout 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public double xCoordinate { get; set; } 
     public double yCoordinate { get; set; } 
    } 
    class Program 
    { 
     private static int getDummyTableSize(ISession session) 
     { 
      ITransaction readTx = session.BeginTransaction(); 
      int size = session.CreateSQLQuery(@"select * from mydb.mytable").List<object>().Count; 
      readTx.Rollback(); 
      return size; 
     } 

     static void Main(string[] args) 
     { 
      Configuration config = new Configuration(); 
      config.Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml")); 

      ISessionFactory factory = config.BuildSessionFactory(); 
      ISession session = factory.OpenSession(); 

      int countBefore = getDummyTableSize(session); 

      ITransaction tx = session.BeginTransaction(); 
      Layout d = new Layout(); 
      d.Id = 213; 
      d.Name = "hello"; 
      d.xCoordinate = 25.823; 
      d.yCoordinate = 746.2; 

      // POINT OF ERROR 
      session.Save(d); 
      tx.Commit(); 

      if (countBefore + 1 == getDummyTableSize(session)) 
      { 
       Console.WriteLine("woo hoo"); 
      } 
      else 
      { 
       Console.WriteLine("oh no"); 
      } 
      session.Close(); 
     } 
    } 
} 

Мой hibernate.cfg.xml (конфигурационный файл):

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider"> 
     NHibernate.Connection.DriverConnectionProvider 
    </property> 
    <property name="connection.driver_class"> 
     NHibernate.Driver.MySqlDataDriver 
    </property> 
    <property name="connection.connection_string"> 
     Server=localhost;Database=mydb;User="root"; 
    </property> 
    <property name="dialect"> 
     NHibernate.Dialect.MySQL5Dialect 
    </property> 
    <!--<mapping assembly="NhibernateORM"/>--> 
    <!-- mapping files --> 
    <!--<mapping resource="Mapping.hbm.xml" />--> 
    </session-factory> 
</hibernate-configuration> 

и мой Mapping.hbm.xml файл:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NhibernateORM" auto-import="true"> 
    <class name="Layout" table="mytable"> 
    <id name="Id" column="ID" type="int"> 
    </id> 
    <property name="Name" column="name" 
      type="String"></property> 
    <property name="xCoordinate" column="xCoordinate" 
      type="double"></property> 
<property name="yCoordinate" column="yCoordinate" 
      type="double"></property> 
    </class> 
</hibernate-mapping> 

Я попытался следующие:

  1. Установить встроенное действие файла сопоставления (Mapping.hbm.xml) на встроенный ресурс и выполнить действие файла конфигурации (hibernate.cfg.xml) для встроенных ресурсов и контента. Также всегда скопируйте копию в каталог вывода.

  2. Установить автоматический импорт в спящий режим отображения-тега и истинным и ложным

  3. Добавить отображение сборки тег в hibernate.cfg.xml, также проверил имя пространства имен и сборки.

  4. Добавление тега ресурса сопоставления в файл hibernate.cfg.xml, который дает ошибку неоднозначного тега сопоставления.

Что еще я могу попробовать? Ошибка возникает непосредственно перед session.save(), и запрос, получающий подсчет строк в таблице выше session.save, работает нормально.

Дополнительно Ниже приводится полное сообщение об ошибке:

NHibernate.MappingException was unhandled 
    HResult=-2146232832 
    Message=No persister for: NhibernateORM.Layout 
    Source=NHibernate 
    StackTrace: 
     at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) 
     at NHibernate.Impl.SessionImpl.GetEntityPersister(String entityName, Object obj) 
     at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event) 
     at NHibernate.Impl.SessionImpl.Save(Object obj) 
     at NhibernateORM.Program.Main(String[] args) in d:\codebase\NhibernateORM\NhibernateORM\Program.cs:line 57 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

ответ

2

Я бы сказал, потому что вся эта информация, мы должны иметь виновника. Есть так много вопросов (ну проблем на самом деле) с отображения и C кодом #, что мы наверняка знаем:

Mapping.hbm.xml не правильно настроен, не используется, не видно для NHibernate

в случае, что этот файл как будет доступен для NHibernate сессии завода, мы получили бы это исключение

System.TypeInitializationException: Инициализатор типа для «экземпляра» выдал исключение. ---> NHibernate.MappingException: Не удалось скомпилировать документ сопоставления: NhibernateORM.Mapping.hbm.xml ---> NHibernate.MappingException: постоянный класс Макет, NhibernateORM не найден ---> System.TypeLoadException: Не удалось загрузить тип 'Layout' с сборки 'NhibernateORM ...

Что может быть исправлена ​​путем добавления атрибута пространства имен для отображения namespace="NhibernateORM"

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
    assembly="NhibernateORM" 
    namespace="NhibernateORM" 
    auto-import="true"> 
    <class name="Layout" table="mytable"> 
    <id name="Id" column="ID" type="int" generator="assigned" /> 
    <property name="Name"  column="name"  type="String"/> 
    <property name="xCoordinate" column="xCoordinate" type="double" /> 
    <property name="yCoordinate" column="yCoordinate" type="double" /> 
    </class> 
</hibernate-mapping> 

Как только будет устранена, мы позже получить это исключение

NHibernate.InvalidProxyTypeException: Следующая типы не могут использоваться в качестве прокси: NhibernateORM.Layout: метод get_Id должен быть «открытым/защищенной виртуальные» или «защищенным внутренней виртуальной» ...

которая может быть исправлена ​​путем все Entity вещей виртуальные:

namespace NhibernateORM 
{ 
    public class Layout 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual double xCoordinate { get; set; } 
     public virtual double yCoordinate { get; set; } 

Так, конечно, мы знаем, - этот вопрос является

  • неправильная конфигурация в hibernate.cfg.xml
  • неправильной конфигурации Mapping.hbm.xml свойства

Это должно быть частью hibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     ... 
     <mapping assembly="NhibernateORM"/> 

hibernate.cfg.xml должны иметь свойства:

  • сборки Действие === Содержание
  • Копирование на вывод Каталог === Копия всегда

Mapping.hbm.xml должны обладать свойствами:

  • Сложение Действие === Embedded Resource
  • Копировать в выходной каталог === Не копировать
+0

Спасибо, к сожалению, я все еще получаю ту же ошибку. – codeln

+0

в этом случае, пожалуйста, проверьте, что ваш файл ** действительно ** есть расширение ** '.hbm.xml' **. Я помню, как только у меня была опечатка ... например. просто * .xml * ... и не смог узнать, почему это сопоставление не загружается ... И если это не поможет, попробуйте использовать явную загрузку файлов с вашим конфигурационным объектом - 'config.AddDirectory()' или ' config.AddFile() '... таким образом вы будете знать, что этот файл был обработан (поместите этот файл сопоставления на какой-то общий ресурс и загрузите его в виде XML-файла) –