当前位置: 首页 > 编程语言 > C#

使用带有NHibernate命名查询的未映射类分享

时间:2023-04-11 03:28:33 C#

C#学习教程:将未映射的类与NHibernate命名查询一起使用Person对象未映射到NHibernate映射,这意味着我得到以下异常:System.Collections.Generic.KeyNotFoundException:给定的键不在字典中。在创建Session时抛出,因为在调用NHibernate.Cfg.Mappings.GetClass(StringclassName)时找不到类名。这都是可以理解的,但我想知道是否有任何方法可以告诉NHibernate使用该类,即使我没有它的映射?为什么不使用:query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));它将查询中每一列的数据插入到Person对象属性中,使用列别名作为属性名称。如何创建返回未映射类型实例的查询?我认为Michal说得有道理,也许你应该看看预测。(至少,这就是我认为你正在寻找的)。您在某种映射类型上创建查询,然后,您可以将该查询“投射”到“DTO”。为了做到这一点,您必须“导入”您的Person类,以便NHibernate知道它并且您将必须使用ResultTransformer。像这样:ICriteriacrit=session.CreateCriteria(typeof(Person));//设置一些过滤条件crit.SetProjection(Projections.ProjectionList().Add(Property("Name"),"Name").Add(Property(...));crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));returncrit.List();但是,这仍然意味着您必须导入该类,以便NHibernate知道它。通过使用该类,NHibernate基本上猜测涉及的所有内容,包括您打算访问的表和字段映射用于Person。NHibernate可以被黑客攻击以根据匹配的名称或事物进行动态绑定,但整个想法是使用xml文件来创建从普通旧数据对象到数据库字段的映射。如果没有一个很好的不映射类的原因,简单地添加映射会给你最好的结果......也就是说,你不能使用命名查询直接将结果注入未映射的类..你需要告诉它要放入哪些列哪些字段,或者换句话说,映射。;)但是,您可以从命名查询返回标量值,并且可以获取这些对象的数组并手动构建集合。为了解决这个问题,我最终使用了TupleToPropertyResultTransformer并提供了一个属性值列表。这有一些限制,主要是SQL查询返回结果的顺序必须与提供给TupleToPropertyResultTransformer构造函数的属性的顺序相同。另外,属性类型是推断出来的,所以需要注意Decimalcolumnsonlyreturnintegervaluesetc.除了使用TupleToPropertyResultTransformer提供了一种相当简单的方法来使用SQL查询返回对象集合,而无需在NHibernate中显式映射对象。以上就是C#学习教程的全部内容:使用非映射类和NHibernate命名查询。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: