【问题标题】:<Map> = IDictionary<地图> = 字典
【发布时间】:2009-08-05 10:07:51
【问题描述】:

我有 3 个实体: 类用户 {id,name...} 类 UserUrl {id,user_id,url,url_type_id} 类 UrlType {id,name} 我的映射:
&lt;class name="User" table="Users" lazy="false"&gt;
&lt;id name="id" type="Int32" column="id"&gt;
&lt;generator class="identity" /&gt;
&lt;/id&gt;
&lt;property name="name" column="name" type="String"/&gt;
&lt;map name="Urls" table="UserUrl"&gt;
&lt;key column="user_id"&gt;&lt;/key&gt;
&lt;index-many-to-many class="UrlType" column="url_type_id"/&gt;
&lt;one-to-many class="UserUrl"/&gt;
&lt;/map&gt;
&lt;/class&gt;
&lt;class name="UserUrl" table="UserUrl"&gt;
&lt;id name="id" type="Int32" column="id"&gt;
&lt;generator class="identity"/&gt;
&lt;/id&gt;
&lt;property name="user_id" column="user_id" type="Int32"/&gt;
&lt;many-to-one name="UrlType" column="url_type_id" class="UrlType"/&gt;
&lt;property name="Url" column="url" type="String" not-null="true"/&gt;
&lt;/class&gt; >
所以 User.Urls 是 IDictionary&lt;UrlType,UserUrl&gt;。但我想得到 Dictionary&lt;string,UserUrl&gt;,其中字符串键是 UrlType.name。 有人知道怎么做吗?

【问题讨论】:

    标签: nhibernate map idictionary


    【解决方案1】:

    NHibernate 将为您提供一个集合接口,在这种情况下为 IDictionary,因为它的实现将涉及代理和缓存,您不会想知道细节。 所以你不会得到字典。

    我的问题是你为什么想要一个字典,你通过 IDictionary 接口访问所有数据,具体类会提供哪些额外功能?

    【讨论】:

    • 示例:class User { .... IDictionary _urls; IDictionary Urls { get{return _urls;} set{_urls=value;} } } ... 用户 curUser = FindById(2);字符串 facebookUrl = curUser.Urls["facebook"];所以我认为获取 IDictionary 比获取 IList 非常有用,因为获取 facebookUrl 不需要对 Ilist 中的每个元素进行 inerate。
    【解决方案2】:

    我找到了目的地。
    映射:

    <class name="User" table="Users" lazy="false">
      <id name="id" type="Int32" column="id">
        <generator class="identity" />
      </id>
      <property name="name" column="name" type="String"/>
      <map name="Urls" lazy="true" cascade="all-delete-orphan" inverse="true">
         <key column="user_id"></key>
         <index column="im_type_id" type="Int32"/>
         <one-to-many class="UserUrl"/>
       </map>
    </class>
    <class name="UserUrl" table="UserUrl">
       <id name="id" type="Int32" column="id">
        <generator class="identity"/>
       </id>
       <property name="user_id" column="user_id" type="Int32"/>
       <property name="UrlType" column="url_type_id" type="Int32" not-null="true" />
       <property name="Url" column="url" type="String" not-null="true"/>
    </class>
    

    代码:

    public sealed class UrlType
    {
      private const string _Facebook = "Facebook";  
      private const string _Myspace = "Myspace";   
      private const string _Youtube = "Youtube";
    
      public static readonly int Facebook;
      public static readonly int Myspace;
      public static readonly int Youtube;
      static UrlType()
      {
         Facebook = FindByName(_Facebook).Id;
         Myspace = FindByName(_Myspace).Id;
         Youtube = FindByName(_Youtube).Id;
      }
    }
    

    用途:

    User curUser = FindById(2);  
    string facebookUrl = curUser.Urls[UrlType.Facebook].Url; 
    

    但是从 DB 中获取 Urls 类型的 id 需要花费更多时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2016-03-18
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2023-03-10
      相关资源
      最近更新 更多