2013-07-19 2 views
0

У меня есть пользовательская коллекция, которая обертывает .net HashSet и реализует ICollection, который затем я отображаю как набор. Я сделал это в надежде, что NHib сможет использовать интерфейс ICollection так, как он может использовать при использовании только .net HashSet, в отличие от Iesi, который NHib использует внутренне.Нестандартная коллекция NHibernate не будет гидратировать

Сохранить в БД, кажется, работает хорошо, но исключение я получаю, когда увлажняющие позволяет мне знать, что нужно сделать больше:

Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericSet`1[ContactMechanisms.Domain.Emails.Email]' to type 'ContactMechanisms.Domain.Emails.EmailCollection'. 

These articles часто упоминаются в качестве способов борьбы с обработкой пользовательских сбора , но ссылки сломаны, и что я вижу, больше интересуется запросом коллекции с расширениями.

Должен ли я использовать IUserCollectionType? У кого-нибудь есть ссылка, показывающая примерную реализацию, если это так? Есть ли что-то глупое в моем текущем коде/сопоставлении?

Какое хорошее решение?

КОД (родительский объект сниппет)

public class Contact : RoleEntity<Party>, IHaveContactMechanisms 
{  
    private readonly ICollection<Email> _emails = new EmailCollection(); 

    public virtual EmailCollection Emails { get { return (EmailCollection) _emails; } } 
} 

КОД (настраиваемая коллекция сниппет)

public class EmailCollection : ContactMechanismSet<Email> { .... } 

public class ContactMechanismSet<T> : ValueObject, ICollection<T> where T : ContactMechanism 
{ 
    private readonly HashSet<T> _set = new HashSet<T>(); 
} 

(коллекция HBM тип значения) ОТОБРАЖЕНИЕ

<set name ="_emails" table="Emails" access="field"> 
    <key column="ContactId"></key> 
    <composite-element class="ContactMechanisms.Domain.Emails.Email, ContactMechanisms.Domain"> 
    <property name="IsPrimary" /> 
    <property name="Address" length="100"/> 
    <property name="DisplayName" length="50"/> 
    </composite-element> 
</set> 

* UPDATE *

ТАК делает нижеследующее в моем объекторе сеттер работает, но - могу ли я лучше?

public virtual EmailCollection Emails { 
    get { 
     if (!(_emails is EmailCollection)) { 
      // NHibernate is giving us an enumerable collection 
      // of emails but doesn't know how to turn that into 
      // the custom collection we really want 
      // 
      _emails = new EmailCollection (_emails); 
     } 
     return (EmailCollection) _emails ; 
    } 
} 
+0

является возможным используйте 'ISet ' вместо 'HashSet ' в реализации EmailCollection? – Firo

ответ

2

если EmailCollection имеет конструктор без параметров, то следующее должно быть возможно с новой NH OOTB и старше с регистрацией CollectionTypeFactory, который обрабатывает .NET Исеть (можно найти в интернете)

public class Contact : RoleEntity<Party>, IHaveContactMechanisms 
{  
    private EmailCollection _emails = new EmailCollection(); 

    public virtual EmailCollection Emails { get { return _emails; } } 
} 

public class ContactMechanismSet<T> : ValueObject, ICollection<T> where T : ContactMechanism 
{ 
    ctor() 
    { 
     InternalSet = new HashSet<T>(); 
    } 

    private ISet<T> InternalSet { get; set; } 
} 

<component name="_emails"> 
    <set name="InternalSet" table="Emails"> 
    <key column="ContactId"></key> 
    <composite-element class="ContactMechanisms.Domain.Emails.Email, ContactMechanisms.Domain"> 
     <property name="IsPrimary" /> 
     <property name="Address" length="100"/> 
     <property name="DisplayName" length="50"/> 
    </composite-element> 
    </set> 
</component> 

 Смежные вопросы

  • Нет связанных вопросов^_^