当前位置:  开发笔记 > 编程语言 > 正文

NHibernate IList to List

如何解决《NHibernateIListtoList》经验,为你挑选了2个好方法。

嗨,我想返回一个建筑领域的集合.

private long _id;
private string _buildingName;
private IList _rooms;

我正在使用NHibernate和这个房间的映射





而我这样称为db;

Buildings = (List)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List();

问题是我不希望_rooms集合成为IList,但我需要它作为List.唉,NHibernate要求我为集合使用Interface.知道如何做到这一点.我是.Net的新手,并认为可能放弃NHibernate可能是前进的方向.我只需要将集合输入为List,这样我就可以继续了.任何帮助非常感谢.



1> yfeldblum..:

这不是NHibernate的工作方式.您无法告诉它您的域模型对象的具体类型是什么.您只能告诉它基本类型和接口是什么.然后它可以选择如何有效地实现域类型.

例如,NHibernate使用自己的内部实现IList,知道如何进行延迟加载.

而且,NHibernate使用自己Building的域模型内部实现.并不一定就是Building你将使用NHibernate的所有对象都具有它们的具体类型Building.它们将是Buildings,无论Building是对象的具体类型,还是它是对象的具体类型的基本类型,它们都是真的.

但这是正确的做法,因为无论如何你应该使用接口和基类型而不是具体类型.NHibernate帮助您使用所有正确的编程方法.

现在,为什么你需要一个List?为什么IList不够?


有充分的理由使用List over IList.作为一个示例,List包含用于构建有用谓词的更多功能.根据我的观点,使用工具强制您使用接口并不是"正确的做法".如果POCO被单独留下并且没有被数据提供者的尾巴摇摆,那将是最好的.如果list和bag映射更好地支持List对象,我个人会喜欢它.

2> Randolpho..:

为什么你需要一个具体的List物体,什么时候你可以做你想要的一切IList

如果它必须是一个具体的列表,你有两个选择.

首先,简单地转换IListList.这只有在基础类型 a 时才有效List,我个人对此表示怀疑.

其次,调用ToList()扩展方法:

Buildings = (List)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List().ToList();

我个人建议你不要这样做,而是使用IList.


最好的解决方案是将网关更改为采用IList(或更好的ICollection或IEnumerable)而不是具体类型.尽可能在最狭窄的范围内使用混凝土类型.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有