首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使NHibernate.Mappings.Attributes工作选项

使NHibernate.Mappings.Attributes工作选项
EN

Stack Overflow用户
提问于 2009-04-24 14:40:25
回答 7查看 10.2K关注 0票数 2

我在一个项目中使用NHibernate.dll的v2.1和NHibernate.Mappings.Attributes的v2.1。

当我进一步运行下面的代码时,我会得到以下异常,并将感谢任何指针。在同一个项目中,如果我删除属性并使用xml映射文件,它就能正常工作。

代码语言:javascript
复制
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: 

我有一个联系人类,如下所示(域类只有一个方法,没有属性):

代码语言:javascript
复制
[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; } 
} 

和会话代码如下:

代码语言:javascript
复制
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文件是:

代码语言:javascript
复制
<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应该创建的文件--异常发生在文件创建之前(它不在输出目录中),因此不幸的是我不能发布它。

EN

回答 7

Stack Overflow用户

发布于 2009-04-25 10:56:59

斯图尔特

再次感谢你的回应。

设法通过以下方法使其工作:

代码语言:javascript
复制
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,但上面的希望可以帮助任何遇到类似问题的人。这些文件似乎严重缺乏。

票数 2
EN

Stack Overflow用户

发布于 2009-05-28 07:12:32

如果你还没有解决你的问题,试试这个

代码语言:javascript
复制
[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; } 
}

我就这样用,效果很好.

票数 1
EN

Stack Overflow用户

发布于 2010-12-06 20:23:07

有一段时间,NHMA没有自动检测类名,因为它们现在在NHibernate中是可选的(在某些情况下,可以使用实体名称)。然而,最近的版本通过设置来恢复自动检测行为,以便在需要时将其关闭。

属性必须手动排序,因为.NET在编译时不能保证它(与Java不同)。

NHMA的最终目标是忠实地复制编写XML版本的方式;因此,如果您有:

代码语言:javascript
复制
<something>
  <innerData/>
</something>

NHMA版本将是:

代码语言:javascript
复制
[Something]
  [InnerData(2)]

NHMA试图聪明地推断某些值(如名称),但只有在需要该值时才会这样做。

它还提供像NameType=typeof(XXX)这样的帮助程序,以便从intellisense、编译时验证和重构中获益。

文档中的更多细节:http://www.nhforge.org/doc/nh/en/index.html#mapping-attributes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/786124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档