外部项目NHibernate Models映射异常:类未映射问题求助
我帮你梳理下这个NHibernate映射异常的常见排查点,你可以一步步来验证:
检查HQL查询语句的类名是否准确
NHibernate的HQL是基于实体类名称(不是数据库表名)来查询的,要注意拼写和大小写(默认是大小写敏感的)。你写的select KUNDE如果对应的实体类是KUNDEN,那这里就写错了——正确的写法应该是select k from KUNDEN k或者直接from KUNDEN。先确认查询里的类名和你的实体类完全一致。确认web.config中NHibernate的程序集配置正确
打开你的web.config,找到<hibernate-configuration>下的<session-factory>节点,检查<mapping assembly="你的模型程序集名称"/>这一行的程序集名称是否和你的NHibernate模型项目的程序集名称完全匹配(包括大小写,不要写错后缀或者版本号)。
示例配置参考:<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <!-- 其他数据库连接、方言等配置 --> <mapping assembly="KundenNHibernateModels"/> <!-- 替换成你的模型程序集名称 --> </session-factory> </hibernate-configuration>验证实体类与映射文件的命名空间匹配
打开KUNDEN.hbm.xml,检查<class>节点的name属性是否正确指向实体类的完整命名空间+类名,比如:<class name="YourProjectNamespace.KUNDEN" table="KUNDEN"> <!-- 字段映射内容 --> </class>如果实体类有特定的命名空间,要么在映射文件里写全,要么在web.config的NHibernate配置中添加
<mapping namespace="YourProjectNamespace"/>,这样HQL查询时可以不用重复写命名空间。另外,如果查询时用了完整命名空间,也要确保拼写正确。再次确认映射文件的嵌入资源设置
虽然你说已经设了,但再核对一遍:右键KUNDEN.hbm.xml文件,在属性面板里把“生成操作”设为嵌入的资源,“复制到输出目录”设为不复制。NHibernate需要从程序集里读取嵌入的映射文件,这个设置错了也会导致找不到映射。检查SessionFactory是否加载了正确的程序集
如果你是通过代码构建SessionFactory,要确保明确加载了实体类所在的程序集,比如:var config = new Configuration(); config.Configure(); // 加载web.config的NHibernate配置 config.AddAssembly(typeof(KUNDEN).Assembly); // 加载实体类所在的程序集 var sessionFactory = config.BuildSessionFactory();如果是完全依赖配置文件,这一步可以忽略,但要确保配置文件里的assembly节点正确。
一般来说,这类异常大多是HQL类名拼写错误、程序集配置不匹配或者映射文件的name属性写错导致的,按上面的步骤排查应该能解决问题。
内容的提问来源于stack exchange,提问作者Fehler40

