c# - NHibernate.Mapping 异常。 Namespace.className 没有持久化器

标签 c# mysql xml nhibernate nhibernate-configuration

查看了 4 个关于同一问题的 stackoverflow 帖子,但找不到解决方案。

我的主程序:

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. 将 hibernate-mapping 标记中的自动导入设置为 true 和 false

  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: 

最佳答案

我想说,因为所有这些信息,我们应该找到罪魁祸首。 映射C#代码存在很多问题(实际上是问题),我们确信知道:

the Mapping.hbm.xml is not correctly configured, not used, not visible for NHibernate

如果该文件按原样可用于 NHibernate session 工厂,我们将收到此异常

System.TypeInitializationException: The type initializer for 'Instance' threw an exception. ---> NHibernate.MappingException: Could not compile the mapping document: NhibernateORM.Mapping.hbm.xml ---> NHibernate.MappingException: persistent class Layout, NhibernateORM not found ---> System.TypeLoadException: Could not load type 'Layout' from assembly '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: The following types may not be used as proxies: NhibernateORM.Layout: method get_Id should be 'public/protected virtual' or 'protected internal virtual'...

这可以通过将所有实体内容虚拟化来解决:

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 必须具有属性:

  • 构建操作 === 嵌入资源
  • 复制到输出目录 === 不复制

关于c# - NHibernate.Mapping 异常。 Namespace.className 没有持久化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788147/

相关文章:

python - 使用 Python 解析(可能是非标准的)XML

java - JAXB XJC 代码生成 - Marshaller 生成的 xml 中缺少 "schemaLocation"

c# - 使用 javascript 的 Asp.net 内容占位符

c# - C#中什么情况下不为公共(public)属性生成私有(private)变量?

c# - 什么是 Visual Studio SDK 中 VirtualSnapshotSpan 中的虚拟空间

mysql - 存储旧数据以加快访问速度的更好方法

c# - 在 Windows 服务中获取当前用户名

mysql - 在 phpMyAdmin 中创建一个约束作为触发器

mysql : Best way to deal with data like average rating of restaurants etc?

sql - 解析xml时如何使用 "cross apply"?