NHibernate无法编译映射

本文关键字:映射 编译 NHibernate | 更新日期: 2023-09-27 17:53:22

我不知道哪里出错了

我使用NHibernate c#并将Assembly附加到Configuration。问题a NHibernateException:无法编译映射Note.hbm.xml

public static class NHibernateHelper
{
    private static Configuration _cfg;
    private static ISessionFactory _sessionFactory;
    private static ISessionFactory SessionFactory {
        get {
            if (_sessionFactory == null) {
                _cfg = new Configuration();
                _cfg.Configure();
                _cfg.AddAssembly(typeof(User).Assembly);
                _cfg.AddAssembly(typeof(Changelog).Assembly);
                _cfg.AddAssembly(typeof(Note).Assembly);

                _sessionFactory = _cfg.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession() {
        return SessionFactory.OpenSession();
    }
    public static void DatabaseSchemaLoader() {
        ISession session = OpenSession();
        new SchemaExport(_cfg).Create(true, true);
        session.Close();
    }
}

My Note class is shared.data.content

namespace CRMSystem.shared.data.content
{
    public class Note
    {    
        public virtual int id { get; set; }
        public virtual string title{ get; set;}
        public virtual string text { get; set; }
        public virtual int priority { get; set; }
        public virtual long createdTime { get; set; }
        public virtual long lastEditTime { get; set; }    
    }
}

Note.hbm.xml(设置构建操作:嵌入资源,复制到输出:总是复制)

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="CRMSystem"
                   namespace="CRMSystem.shared.data.content">
  <class name="Note" table="`Note`" lazy="false">

    <id name="id" column="`id`" type="int">
      <generator class="identity"></generator>
    </id>
    <property name="title" column="`title`" type="String"/>
    <property name="text" column="`text`" type="String" />
    <property name="priority" column="`priority`" type="int" />
    <property name="createdTime" column="`createdTime`" type="long" />
    <property name="lastEditTime" column="`lastEditTime`" type="long" />
  </class>
</hibernate-mapping>

谢谢你的回答。

我今天尝试了很多方法,发现它是有效的:

_cfg.Configure();
_cfg.AddAssembly(typeof(User).Assembly);
//_cfg.AddAssembly(typeof(Changelog).Assembly);
//_cfg.AddAssembly(typeof(Note).Assembly);

当我添加:(any class)

_cfg.AddAssembly(typeof(Changelog).Assembly);

每次我得到一个错误:无法编译Note.hbm.xml我可以保存到数据库的每一个类(用户,变更日志,笔记)。我无法解释。

有人遇到过这样的情况吗?

完全例外:

    NHibernate.MappingException: Could not compile the mapping document: CRMSystem.shared.data.mapping.Note.hbm.xml ---> NHibernate.DuplicateMappingException: Duplicate class/entity mapping CRMSystem.shared.data.content.Note
   w NHibernate.Cfg.Mappings.AddClass(PersistentClass persistentClass)
   w NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(HbmClass classSchema, IDictionary`2 inheritedMetas)
   w NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(HbmClass rootClass, IDictionary`2 inheritedMetas)
   w NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas)
   w NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(HbmMapping mappingSchema)
   w NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
   w NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
   w NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
   w NHibernate.Cfg.Configuration.ProcessMappingsQueue()
   w NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)
   w NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name)
   w NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name)
   w NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)
   w NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)

当我没有添加任何东西时,得到异常:no persister

NHibernate无法编译映射

EXTEND

根据最新的更新,我们可以看到,nhibernate归咎于:

…复制类/实体映射CRMSystem.shared.data.content.Note…

这意味着,在我们的例子中,其他文件可能包含NOTE映射,例如在user。hbm.xml中可能有一些被遗忘的映射

<class name="Note" ...

原始部分

代码是ok 一样。我在本地尝试了您的 Note 类和 Note.hbm.xml 。按预期工作。

问题似乎是一些拼写错误,我很难复制(例如。不同的程序集名称)。或者,尽管对Note.hbm.xml负有责任……也可以是其他的映射

// there could be also some issue
_cfg.AddAssembly(typeof(User).Assembly);
_cfg.AddAssembly(typeof(Changelog).Assembly);

无论如何,尝试观察INNER异常。会有清晰的问题描述。例如,对于这个映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               // instead of this
               // assembly="CRMSystem"
               // we have this
               assembly="WrongAssembly"
               namespace="CRMSystem.shared.data.content">

我们将收到完整的异常:

NHibernate。MappingException: 无法编译映射文档:…Note.hbm.xml -> NHibernate。MappingException:持久化类
CRMSystem.shared.data.content。System.IO.FileNotFoundException: Could not load file or assembly 'WrongAssembly'或其依赖项之一。系统找不到指定的文件。WRN:程序集绑定日志被关闭。

注意:内嵌资源属性必须,建议使用不复制。这个文件将是dll的一部分,它不需要作为文件复制。