2009-08-05 3 views
0

У меня есть 3 сущности: класса User {идентификатор, имя ...} класс UserUrl {идентификатор, user_id, URL, url_type_id} класс UrlType {идентификатор, имя} Мое отображение:
<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. Кто-нибудь знает, как это сделать?<Map> = IDictionary

ответ

0

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

Вопрос: почему вы хотите использовать словарь, вы получаете доступ ко всем данным через интерфейс IDictionary, какую дополнительную функциональность может дать конкретный класс?

+0

Пример: класс Пользователь {.... IDictionary <строка, UserUrl> _urls; IDictionary <строка, UserUrl> Urls { GET {возвращение _urls;} множество {_urls = значение;}} } ... Пользователь curUser = FindById (2); string facebookUrl = curUser.Urls ["facebook"]; Так что я думаю, что очень полезно получить IDictionary, чем IList, потому что для получения facebookUrl нет необходимости перебирать каждый элемент в Ilist. – 2009-08-06 10:39:55

0

.
Mapping:

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

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