<map> = IDictionary </map>

时间:2009-08-05 10:07:51

标签: nhibernate map idictionary

我有3个实体: class User {id,name ...} class UserUrl {id,user_id,url,url_type_id} class UrlType {id,name} 我的映射:
<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" table="UserUrl">
<key column="user_id"></key>
<index-many-to-many class="UrlType" column="url_type_id"/>
<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"/>
<many-to-one name="UrlType" column="url_type_id" class="UrlType"/>
<property name="Url" column="url" type="String" not-null="true"/>
</class> &GT;
所以User.Urls是IDictionary <UrlType,UserUrl>。但我想得到词典<string,UserUrl>,其中字符串键是UrlType.name。 有人知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我发现了自己的想法 映射:

<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