我试图使用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中)