Просмотрели 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>
Я попытался следующие:
Установить встроенное действие файла сопоставления (
Mapping.hbm.xml
) на встроенный ресурс и выполнить действие файла конфигурации (hibernate.cfg.xml
) для встроенных ресурсов и контента. Также всегда скопируйте копию в каталог вывода.Установить автоматический импорт в спящий режим отображения-тега и истинным и ложным
Добавить отображение сборки тег в
hibernate.cfg.xml
, также проверил имя пространства имен и сборки.- Добавление тега ресурса сопоставления в файл
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:
Спасибо, к сожалению, я все еще получаю ту же ошибку. – codeln
в этом случае, пожалуйста, проверьте, что ваш файл ** действительно ** есть расширение ** '.hbm.xml' **. Я помню, как только у меня была опечатка ... например. просто * .xml * ... и не смог узнать, почему это сопоставление не загружается ... И если это не поможет, попробуйте использовать явную загрузку файлов с вашим конфигурационным объектом - 'config.AddDirectory()' или ' config.AddFile() '... таким образом вы будете знать, что этот файл был обработан (поместите этот файл сопоставления на какой-то общий ресурс и загрузите его в виде XML-файла) –