代码之家  ›  专栏  ›  技术社区  ›  mpontillo

在NHibernate中正确定义版本属性有什么诀窍吗?

  •  0
  • mpontillo  · 技术社区  · 14 年前

    我试图使用NHibernate映射一个使用 decimal(9,0)

    这些字段在数据库中声明为空,在NHibernate参考手册的第5.1.7节中声明:

    ... 所以我把它们映射为 int? 版本属性。

    <?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping namespace="Model" assembly="Model" xmlns="urn:nhibernate-mapping-2.2">
        <class name="Bar" lazy="true" table="`BAR`" schema="`dbo`">
            <id name="ID" access="property" column="`ID`">
                <generator class="assigned" />
            </id>
            <version name="Version" column="`VERSION`" type="int?" />
            <!-- ... etc ... -->
        </class>
    </hibernate-mapping>
    

    但是,在运行时,这会失败得很惨,出现类似以下情况的异常:

    failed: NHibernate.MappingException : Could not compile the mapping document: Model.Mappings.Bar.hbm.xml
      ----> NHibernate.MappingException : Could not determine type for: Model.int?,  for columns: NHibernate.Mapping.Column(VERSION)
        at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
        at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
        at NHibernate.Cfg.Configuration.ProcessMappingsQueue()
        at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)
        at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name)
        at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name)
        at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)
        at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)
        Core\DAOUtils.cs(33,0): at Core.DAOUtils.OpenSession()
        test\cs\FooTest.cs(65,0): at DataModel.Tests.FooTest.TestSelectStar()
        --MappingException
        at NHibernate.Mapping.SimpleValue.get_Type()
        at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.BindProperty(HbmVersion versionSchema, Property property, IDictionary`2 inheritedMetas)
        at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.BindVersion(HbmVersion versionSchema, PersistentClass rootClass, Table table, IDictionary`2 inheritedMetas)
        at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(XmlNode node, HbmClass classSchema, IDictionary`2 inheritedMetas)
        at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(XmlNode parentNode, IDictionary`2 inheritedMetas)
        at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node)
        at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
    

    正确使用NHibernate的版本属性有什么诀窍吗,或者我做错了什么?

    对我来说,一件奇怪的事情是NHibernate似乎将我的程序集/命名空间名称附加到 内景?

    编辑:

    更改要使用的映射文件后 int 而不是 内景?

    System.InvalidCastException : Unable to cast object of type 'NHibernate.Type.DecimalType' to type 'NHibernate.Type.IVersionType'.
        at NHibernate.Tuple.PropertyFactory.BuildVersionProperty(Property property, Boolean lazyAvailable)
        at NHibernate.Tuple.Entity.EntityMetamodel..ctor(PersistentClass persistentClass, ISessionFactoryImplementor sessionFactory)
        at NHibernate.Persister.Entity.AbstractEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory)
        at NHibernate.Persister.Entity.SingleTableEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping)
        at NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg)
        at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
        at NHibernate.Cfg.Configuration.BuildSessionFactory()
    

    不幸的是,NHibernate在这里没有给我一个非常详细的错误消息(很高兴知道数百个类中的哪个类抛出了这个),而且我还没能说服log4net工作,所以我现在不知所措。

    编辑#2:

    总结一下“窍门”:

    • decimal 在数据库中)确保所有版本属性都声明为 在映射XML中。(不过,如果 内景?
    • 确保没有将版本属性设置为 十进制的 类型(在POCOs或映射XML中)
    1 回复  |  直到 14 年前
        1
  •  1
  •   Goblin    14 年前