2012-03-05 131 views
2

当我试图对POCO对数据库执行CRUD操作时,我得到一个异常:NHibernate映射例外:没有持久性:MyNamespace.Model.User。使用流利NHibernate时映射异常

这里是我的代码:

namespace MyNamespace.Model 
{ 
    public interface IModel<TID> 
    { 
     TID ID { get; set; } 
    } 

    public class User : IModel<int> 
    { 
     public virtual int ID { get; set; } 
     public virtual string Name { get; set; } 
    } 
} 

,这里是我的映射

namespace MyNamespace.Model.Mapping 
{ 
    public class UserMap : ClassMap<User> 
    { 
     public UserMap() 
     { 
      Table("User"); 
      Id(x => x.ID); 
      Map(x => x.Name) 
       .Length(255) 
       .Unique() 
       .Not.Nullable(); 
     } 
    } 
} 

在我的配置文件我已经添加了装配映射:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     ... 
     <mapping assembly="MyNamespace" /> 
    </session-factory> 
</hibernate-configuration> 

我知道,这样的如果使用hbm文件,则未设置为嵌入式资源时会发生问题。但在我的情况下,我使用的流利NHibernate没有这样的文件被使用。我也在这里读到,Mapping类应该是公开的 - 我已经完成了,正如你所看到的。我的模型类的所有属性都是虚拟的(以允许代理完成他们的魔术)。我完全不知道我在这里错过了什么,我很乐意听到这个问题的任何建议。

回答

2

<mapping>元素用于hbm资源,而不是流利的映射。

这是直接从功能NHibernate docs

private static ISessionFactory CreateSessionFactory() 
{ 
    return Fluently.Configure() 
    .Database(
     SQLiteConfiguration.Standard 
     .UsingFile("firstProject.db") 
    ) 
    .Mappings(m => 
     m.FluentMappings.AddFromAssemblyOf<Program>()) 
    .BuildSessionFactory(); 
} 
+0

目前我无法尝试您的解决方案,但我很好奇为什么这可能是原因。我正在使用'configuraton.BuildSessionFactory()'以相同的老式方式配置会话工厂。考虑到app.config设置,可能映射类没有被扫描?使用不同的方式来配置相同信息的同一事物有点令人困惑,并且结果是它的工作方式不同。 – 2012-03-06 08:46:58

+0

NHibernate不了解Fluent。因此,NH的本地配置不可能读取Fluent映射。 – 2012-03-06 12:38:05

+0

谢谢你的回答和澄清。现在我意识到,流利的维护映射信息的方式完全不同,可能与hbm专用存储不兼容。我错误地认为Fluent会考虑在app.config中传递的程序集。 – 2012-03-07 08:15:13

1

大部分时间此错误消息意味着NHibernate的没有映射实体您试图保存。因此,使用FluentNHibernate配置会话工厂以为其提供映射。