У меня есть пользовательская коллекция, которая обертывает .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 ;
}
}
является возможным используйте 'ISet' вместо 'HashSet ' в реализации EmailCollection? –
Firo