我在一个项目中使用NHibernate.dll的v2.1和NHibernate.Mappings.Attributes的v2.1。
当我进一步运行下面的代码时,我会得到以下异常,并将感谢任何指针。在同一个项目中,如果我删除属性并使用xml映射文件,它就能正常工作。
NHibernate.MappingException was unhandled
Message="Could not compile the mapping document:
DomainModel.hbm.xml"
Source="NHibernate"
InnerException: System.NullReferenceException
Message="Object reference not set to an instance of an object."
Source="NHibernate"
StackTrace:
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass
(XmlNode node, PersistentClass model)
at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind
(XmlNode node, HbmClass classSchema)
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(XmlNode
parentNode)
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node)
at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
InnerException: 我有一个联系人类,如下所示(域类只有一个方法,没有属性):
[NHibernate.Mapping.Attributes.Class]
public class Contact : DomainClass
{
[NHibernate.Mapping.Attributes.Id(Name = "Id")]
[NHibernate.Mapping.Attributes.Generator(1, Class ="Identity")]
public virtual int ID { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string Name { get; set; }
[NHibernate.Mapping.Attributes.Property]
public virtual string Town { get; set; }
} 和会话代码如下:
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddInputStream(NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
typeof(Contact).Assembly), "DomainModel.hbm.xml");
_sessionFactory=cfg.BuildSessionFactory(); 我的hibernate.cfg.xml文件是:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</
property>
<property name="connection.connection_string">Server=SERVER
\EXPRESS2008;Initial Catalog=Contacts;Integrated Security=True</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFac tory, NHibernate.ByteCode.LinFu</property>
</session-factory>
</hibernate-configuration> 斯图尔特
据我所知,"DomainModel.hbm.xml“是NHibernate.Mappings.Attributes应该创建的文件--异常发生在文件创建之前(它不在输出目录中),因此不幸的是我不能发布它。
发布于 2009-04-25 10:56:59
斯图尔特
再次感谢你的回应。
设法通过以下方法使其工作:
using (MemoryStream stream = new MemoryStream())
{
HbmSerializer.Default.HbmNamespace = "NSpace.DomainLayer.Entities";
HbmSerializer.Default.HbmAssembly = "NSpace";
HbmSerializer.Default.Serialize(stream,
System.Reflection.Assembly.GetExecutingAssembly());
stream.Position = 0;
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddInputStream(stream);
_sessionFactory = cfg.BuildSessionFactory();
} 并在类属性中指定表名(我的疏忽与类名不同!)。
不确定为什么我们需要单独指定名称空间,因为我假设NHibernate可以从程序集中序列化类型。
尽管我的印象是很少有人使用NHibernate.Mappings.Attributes,但上面的希望可以帮助任何遇到类似问题的人。这些文件似乎严重缺乏。
发布于 2009-05-28 07:12:32
如果你还没有解决你的问题,试试这个
[NHibernate.Mapping.Attributes.Class(Table="youtable",NameType=typeof(Contact ))]
public class Contact : DomainClass
{
[NHibernate.Mapping.Attributes.Id(Name = "Id")]
[NHibernate.Mapping.Attributes.Generator(1, Class ="Identity")]
public virtual int ID { get; set; }
[NHibernate.Mapping.Attributes.Property(Name="Name")]
public virtual string Name { get; set; }
[NHibernate.Mapping.Attributes.Property(Name="Town")]
public virtual string Town { get; set; }
}我就这样用,效果很好.
发布于 2010-12-06 20:23:07
有一段时间,NHMA没有自动检测类名,因为它们现在在NHibernate中是可选的(在某些情况下,可以使用实体名称)。然而,最近的版本通过设置来恢复自动检测行为,以便在需要时将其关闭。
属性必须手动排序,因为.NET在编译时不能保证它(与Java不同)。
NHMA的最终目标是忠实地复制编写XML版本的方式;因此,如果您有:
<something>
<innerData/>
</something>NHMA版本将是:
[Something]
[InnerData(2)]NHMA试图聪明地推断某些值(如名称),但只有在需要该值时才会这样做。
它还提供像NameType=typeof(XXX)这样的帮助程序,以便从intellisense、编译时验证和重构中获益。
文档中的更多细节:http://www.nhforge.org/doc/nh/en/index.html#mapping-attributes
https://stackoverflow.com/questions/786124
复制相似问题