您好我正在尝试返回构建域的集合。
private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;
我正在使用NHibernate和房间的这种映射
<bag name="rooms" table="tb_rooms" lazy="false">
<key column="buildingID"/>
<one-to-many class="Room"/>
</bag>
我正在这样调用db;
Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();
问题是我不希望_rooms集合成为IList,但我需要它作为List。唉,NHibernate要求我为集合使用Interface。 知道如何做到这一点。我是.Net的新手,并认为可能放弃NHibernate可能是前进的方向。我只需要将集合输入为List,这样我就可以继续了。 任何帮助非常感谢。
答案 0 :(得分:12)
这不是NHibernate的工作方式。您无法告诉它您的域模型对象的具体类型是什么。您只能告诉它基本类型和接口是什么。然后它可以选择如何有效地实现域类型。
例如,NHibernate使用自己的IList<T>
内部实现,知道如何进行延迟加载。
此外,NHibernate在您的域模型中使用自己的Building
内部实现。不一定是您将与NHibernate一起使用的所有Building
对象都具有Building
作为其具体类型。只有Building
是对象的具体类型,或者它是否是对象的具体类型的基本类型,它们才是Building
s。
但这是正确的做法,因为你假设使用接口和基类型而不是具体类型。 NHibernate帮助您使用所有正确的编程方法。
现在,为什么你需要一个List<Building>
?为什么IList<Building>
不够?
答案 1 :(得分:5)
为什么你需要一个具体的List
对象,当你可以用IList
做你想做的一切?
如果绝对必须是具体列表,您有两种选择。
首先,只需将IList<Building>
转换为List<Building>
即可。这只有在基础类型 为List<Building>
时才有效,我个人对此表示怀疑。
其次,在其上调用ToList()扩展方法:
Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>().ToList();
我个人建议您不要这样做,而是使用IList。
答案 2 :(得分:2)
使用List<T>
的{{1}}构造函数怎么样?然后你可以使用:
IEnumerable<T>