2010-01-29 62 views
3

我有一个工作一对多的关系(不bbidirectional)其中资源有一套许多分配的实施,如下所示。这个域需要做更多的分配,这些分配只需要使用AddAllocation,RemoveAllocation等来管理它。所以从对象的角度来看,我想把那些与持久相关的额外逻辑放到不同的类AllocationCollection中,并且让这个额外的类对NHib透明。nhibernate自定义集合处理

我还想用TDD方式充实AllocationCollection的响应能力,但我不确定如何重构现有类,以便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 
    } 
} 

MAPPING

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

回答

6

比利麦卡弗蒂与NHibernate的自定义集合工作有excellent series of articles。我个人不再使用自定义集合类型。我使用AddMyType,RemoveMyType等方法控制包含集合(即聚合根)的类的集合访问。我公开收集为IEnumerable<MyType>。我用IEnumerable<MyType>上的扩展方法替换了其他自定义集合访问器。

+0

比利的文章正是我一直在寻找的!我看到[Colin Jack发布](colinjack.blogspot.com /.../ nhibernate-mapping-custom-collections.html)答复,他以我想的方式使用自定义集合提供解决方案,但比利的解决方案使用现在,对于我来说,查询的扩展方法对我来说是最小的入侵。谢谢! – Berryl 2010-01-29 16:52:00

+0

我同意你关于在父类中保持集合维护(添加,删除) - 这是控制域内集合查询的问题,不会导致父类和违反SRP,同时容易映射出来,和你的链接地址。 – Berryl 2010-01-29 16:56:14

+0

我几乎完全同意使用IEnumerable并控制添加和删除聚合根上的集合,但在时间集合(随时间变化的事物)的情况下,我相信一个自定义时间集合会非常好。我设想做这样的事情:contract.Rate [new DateTime(2001,01,01)]得到的速率“截至2001/01/01而不是contract.RateAsOf ...我认为这将是很好的,因为有您需要为每个类的每个“时态属性”添加很多时间行为。 – Loudenvier 2012-07-01 15:55:10