Специальная коллекция NHibernate не увлажняет
У меня есть пользовательская коллекция, которая упаковывает.net HashSet и реализует ICollection, которую я затем отображаю как набор. Я сделал это в надежде, что NHib сможет использовать интерфейс ICollection так же, как при использовании только.net HashSet, в отличие от Iesi, который NHib использует внутри себя.
Сохранение в БД, кажется, работает нормально, но исключение, которое я получаю при увлажнении, дает мне понять, что мне нужно сделать больше:
Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericSet`1[ContactMechanisms.Domain.Emails.Email]' to type 'ContactMechanisms.Domain.Emails.EmailCollection'.
Эти статьи часто цитируются как способы решения пользовательской обработки коллекции, но ссылки не работают, и то, что я вижу, больше касается запросов к коллекции с расширениями.
Должен ли я использовать IUserCollectionType? У кого-нибудь есть ссылка, показывающая пример реализации, если так? Есть ли что-то глупое, что я делаю в моем текущем коде / отображении?
Какое хорошее решение?
CODE (фрагмент родительского объекта)
public class Contact : RoleEntity<Party>, IHaveContactMechanisms
{
private readonly ICollection<Email> _emails = new EmailCollection();
public virtual EmailCollection Emails { get { return (EmailCollection) _emails; } }
}
CODE (пользовательский фрагмент коллекции)
public class EmailCollection : ContactMechanismSet<Email> { .... }
public class ContactMechanismSet<T> : ValueObject, ICollection<T> where T : ContactMechanism
{
private readonly HashSet<T> _set = new HashSet<T>();
}
MAPPING (коллекция типов значений 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>
* ОБНОВИТЬ *
Так что выполнение ниже в моем объекте сеттер работает, но - я могу сделать лучше??
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 ;
}
}
1 ответ
Если EmailCollection имеет конструктор без параметров, то должно быть возможно следующее с более новым NH ootb и старше с регистрацией CollectionTypeFactory, которая обрабатывает.NET ISet (можно найти в Интернете)
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>