<Map> = IDictionary - PullRequest
       19

<Map> = IDictionary

0 голосов
/ 05 августа 2009

У меня есть 3 объекта: класс 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> >
Таким образом, User.Urls - это IDictionary <UrlType,UserUrl>. Но я хочу получить словарь <string,UserUrl>, где строковый ключ - UrlType.name. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 13 августа 2009

Я узнаю о желании.
Отображение:

<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; 

Но это больше времени, чтобы получить идентификаторы типов Urls из БД

0 голосов
/ 05 августа 2009

NHibernate предоставит вам интерфейс для коллекций, в этом случае IDictionary, поскольку его реализация будет включать прокси и кэширование, и вам не нужно будет знать подробности. Так что вы не получите словарь.

У меня такой вопрос: зачем вам Словарь, вы получаете доступ ко всем данным через интерфейс IDictionary, какие дополнительные функции даст конкретный класс?

...