域模型与实体FW:这是一种在持久性模型中拆分有用的情况吗?

时间:2014-09-04 11:02:16

标签: c# entity-framework domain-driven-design

在DDD方法中,我有一个域模型(DM),具有丰富的行为。假设我有一个名为Order和相对LineOrder的根实体。公开的LineOrder集合需要是IReadOnlyCollection,因为没有人可以任意改变集合。在代码中:

public class Order : AggregateRoot {
    // fields
    private List<LineOrder> lineOrder;

    // ctors
    private Order() {
        this.lineOrder = new List<LineOrder>();
        // other initializations
    }

    // properties
    public IReadOnlyCollection<LineOrder> LineOrder {
        get
        {
            return lineOrder.AsReadOnly();
        }
    }

    // behaviours  
}

到目前为止,这么好。但是当我想要坚持这个域时,我有一些Entity Framework强加的技术限制(即使我有一个值对象,一个无参数构造函数等,也需要一个键),这与DDD方法不完全匹配。 我的另一个限制是:

public class OrderConfiguration : EntityTypeConfiguration<Order>
{
    public OrderConfiguration()
    {
        ToTable("Order");
        HasMany<LineOrder>(m => m.LineOrder); // Exception: Cannot convert from IReadOnlyCollection to ICollection
    }
}

我无法将IReadOnlyCollection投射到ICollection(顺便说一句,如果LineOrderICollection,一切正常!)。

由于我上面表达的原因:在这种情况下可能有用吗创建一个持久性模型(具有所属缺点:映射DM / PM和反之)?

还有其他选择吗?最重要的是:有没有一种非常适合DDD方法的替代方案?

1 个答案:

答案 0 :(得分:1)

您是否尝试将LineOrder集合声明为protected?这样EF就可以访问,但消费者却没有。

// properties
protected ICollection<LineOrder> LineOrder { get; set; }

然后,您可以通过以下方式以只读方式将此集合公开给最终用户:

public IReadOnlyCollection<LineOrder> ReadOnlyLineOrder
{
    get
    {
        return LineOrder.ToList().AsReadOnly();
    }
}