обработка пользовательских коллекций nhibernate - PullRequest
3 голосов
/ 29 января 2010

У меня есть рабочее отношение один ко многим (НЕ двунаправленное), где у Ресурса есть множество множества Выделений, как показано ниже. Домен должен делать больше с коллекцией выделений, которая просто управляет им с помощью AddAllocation, RemoveAllocation и т. Д. Итак, с точки зрения объекта, я бы хотел поместить эту дополнительную логику, которая не является постоянной, связанной с другим классом, AllocationCollection, и сделайте этот дополнительный класс прозрачным для NHib.

Я также хотел бы конкретизировать обязанности AllocationCollection в стиле TDD, но я не уверен, как реорганизовать существующий класс, чтобы NHib все еще работал, составляя карту. Как бы вы это сделали?

Ура, Berryl

МОДЕЛЬ

public class Resource {

    public virtual ICollection<Allocation> Allocations
    {
        get { return _allocations ?? (_allocations = new HashSet<Allocation>()); }
        private set { _allocations = value; } // Nhib will use this
    }
}

КАРТЫ

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ...
<class xmlns="urn:nhibernate-mapping-2.2" name="Domain.Model.Resources.Resource, ... table="Resources">
....
<set cascade="all-delete-orphan" name="Allocations">
  <key foreign-key="Allocations_Resource_FK">
    <column name="ResourceId" />
  </key>
  <one-to-many class="Model.Allocations.Allocation, ... />
</set>

1 Ответ

6 голосов
/ 29 января 2010

У Билли МакКафферти есть превосходная серия статей о работе с пользовательскими коллекциями в NHibernate. Лично я больше не использую пользовательские типы коллекций. Я контролирую доступ к коллекции из класса, содержащего коллекцию (т.е. агрегатный корень), с помощью методов AddMyType, RemoveMyType и т. Д. Я выставляю коллекцию как IEnumerable<MyType>. Я заменил другие пользовательские средства доступа к коллекции методами расширения на IEnumerable<MyType>.

...