【问题标题】:NHibernate IList to ListNHibernate IList 到列表
【发布时间】:2009-01-30 02:50:09
【问题描述】:

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

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 可能是前进的方向。我只需要将集合类型化为列表,以便继续。 非常感谢任何帮助。

【问题讨论】:

    标签: .net nhibernate remoting


    【解决方案1】:

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

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

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

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

    现在,您为什么需要List&lt;Building&gt; 本身?为什么IList&lt;Building&gt; 不够用?

    【讨论】:

    • 谢谢。我需要映射到 List 的原因是,当对象从 flex ui 返回到 .net 时,我正在使用的 AMF 网关无法映射回 IList。我已经通过使用 List 而不是 Ilist 的 usings dtos 解决了,然后根据需要进行转换。赞赏。
    • 有充分的理由使用 List 而不是 IList。作为一个示例,列表包含更多用于构建有用谓词的功能。在我看来,拥有一个工具会迫使你使用接口并不是“正确的做法”。最好不要让 POCO 受到影响,而不是被您的数据提供者的尾巴所左右。如果列表和包映射对 List 对象有更好的支持,我个人会喜欢它。
    【解决方案2】:

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

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

    首先,只需将IList&lt;Building&gt; 转换为List&lt;Building&gt;。这仅在底层类型 List&lt;Building&gt; 时才有效,我个人对此表示怀疑。

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

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

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

    【讨论】:

    • 我同意,你最好处理接口。这种方式更加灵活!
    • 感谢您的帮助。原因是当我在更新等之后(从 ui (flex))发回对象时,网关会将对象映射回来,然后在成为 IList 的房间中阻止。网关强制我使用 List。
    • 仅仅通过 NHibernate 将数据导出并返回到数据库是相当棘手的。
    • 好吧,如果你必须这样做。可能使用 ToList() 而不是强制转换,以防万一底层类型不是 List。
    • 最好的解决方案是将网关更改为采用 IList(或更好的 ICollection 或 IEnumerable)而不是具体类型。尽可能在最窄的范围内使用具体类型。
    【解决方案3】:

    使用带有IEnumerable&lt;T&gt;List&lt;T&gt; 的构造函数怎么样?然后你可以使用:

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

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多