3

您好我正在尝试返回建筑域的集合。

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>

我这样称呼数据库;

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

问题是我不希望 _rooms 集合成为 IList,但我需要它成为 List。唉,NHibernate 要求我为集合使用一个接口。任何想法如何做到这一点。我是 .Net 的新手,我认为放弃 NHibernate 可能是前进的方向。我只需要将集合类型化为列表,以便继续。非常感谢任何帮助。

4

3 回答 3

12

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

例如,NHibernate 使用它自己的内部实现,IList<T>它知道如何进行延迟加载。

此外,NHibernate 使用自己Building的域模型内部实现。Building您将与 NHibernate 一起使用的所有对象不一定都具有,作为它们的具体类型, Building. 无论是对象的具体类型,还是对象具体类型的基类型,它们都是Buildings才是真的。Building

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

现在,你为什么需要一个List<Building>本身?为什么会IList<Building>不够?

于 2009-02-01T22:32:43.580 回答
5

为什么你需要一个具体的List对象,当你可以做任何你想做的事情时IList

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

首先,只需将IList<Building>to 转换为List<Building>。这仅在基础类型a时才有效List<Building>,我个人对此表示怀疑。

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

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

我个人建议您两者都不做,而是使用 IList。

于 2009-01-30T03:01:30.590 回答
2

List<T>使用that的构造函数怎么样IEnumerable<T>?然后你可以使用:

Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());
于 2009-02-01T22:23:37.327 回答