NHibernate的IList转换为List

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可能是前进的道路。我只需要将集合类型化为List,以便继续进行。 非常感谢您的任何帮助。
3个回答

12
这不是 NHibernate 的工作方式。您不能告诉它您的域模型对象的具体类型,您只能告诉它基本类型和接口是什么。然后它会选择如何有效地实现域类型。
例如,NHibernate 使用自己内部实现的 IList<T> 来进行延迟加载。
此外,NHibernate 使用您的域模型中的 Building 的自己内部实现。并不是所有与 NHibernate 配合使用的 Building 对象都将以其具体类型Building为例,而只有在该对象的具体类型是Building 或者它的具体类型的基础类型时,才是真正的 Building 对象。
但是这是正确的做法,因为您应该使用接口和基本类型而不是具体类型。NHibernate 帮助您使用了所有正确的编程方法。
那么,为什么您需要 List<Building> 呢? IList<Building> 是否已经足够了呢?

谢谢。我需要映射到List的原因是,我使用的AMF网关无法在从Flex UI返回对象到.NET时映射回IList。我已经使用了使用List而不是IList的DTO来解决这个问题,然后根据需要进行转换。感激不尽。 - user17510
2
使用List而不是IList有很多好处。例如,List包含更多用于构建有用谓词的功能。强制使用接口并不是“正确的做法”在我看来。最好让POCO保持原样,不要被数据提供程序牵着鼻子走。如果列表和包映射对List对象有更好的支持,那就太好了。 - MarkDav.is

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。

我同意,你最好处理接口。这样更加灵活! - Jim Petkus
感谢您的帮助。问题在于,当我从 UI(Flex) 发送对象返回后进行更新等操作时,网关将对对象进行映射,然后会因为 rooms 是 IList 而出现错误。网关强制我使用 List。 - user17510
将数据从Flex中取出并通过NHibernate存回数据库是相当棘手的。 - user17510
好吧,如果你必须这样做,那就这样做吧。为了防止底层类型不是List,最好使用ToList()而不是强制转换。 - Randolpho
4
最佳解决方案是更改网关,以接受IList(或更好的ICollection或IEnumerable),而不是具体类型。尽可能将具体类型的使用范围缩小到最小。 - Tim Scott

2
如何使用接受 IEnumerable<T> 参数的 List<T> 构造函数?这样你就可以使用以下代码:
Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接