在聚合根目录的子级中保存修改的正确方法

时间:2018-12-10 18:25:13

标签: c# entity-framework domain-driven-design ddd-repositories ef-core-2.1

我有这个aggregationRoot:

 public class Room : Entity
{
    public Room()
    {
        RoomRates = new HashSet<RoomRate>();
    }


    public string Name { get; set; }

    public ICollection<RoomRate> RoomRates { get; }

    public int HotelId { get; set; }

    public void AddRoomRate(DateRange period, Money price)
    {

       RecalculateRates(period);

       RoomRates.Add(new RoomRate{Period = period, Price = price, RoomId = Id});

    }

孩子:

public class RoomRate : Entity
{

    public DateRange Period { get; set; }

    public Money Price { get; set; }

    public int RoomId { get; set; }

    public void SetStart(DateTime start) {
        Period = new DateRange(start, Period.End);

    }

    public void SetEnd(DateTime end)
    {
        Period = new DateRange(Period.Start, end);

    }


}

RecalculateRates方法可以添加或修改子项:

foreach (var rateToReArrange in ratesToReArrange)
        {
            var periodToReArrange = rateToReArrange.Period;

            if (periodToReArrange.Contains(ratePeriod))
            {
                RoomRates.Add(new RoomRate
                {
                    Period = new DateRange(periodToReArrange.Start, dayBeforePeriodStarts),
                    Price = rateToReArrange.Price, RoomId = rateToReArrange.RoomId
                });



                rateToReArrange.SetStart(dayAfterPeriodEnds); 

                return;


            }

            if (rateToReArrange.Period.StartsInRange(ratePeriod))
            {
                rateToReArrange.SetStart(dayAfterPeriodEnds); 

                return;
            }

            if (rateToReArrange.Period.EndsInRange(ratePeriod))
            {
                rateToReArrange.SetEnd(dayBeforePeriodStarts);

                return;
            }
        }

添加孩子后,我将重新计算以保存根:

room.AddRoomRate(new DateRange(request.Start,request.End), new Money(request.Amount, request.Currency.ToString()));

        _context.Rooms.Update(room);

        await _context.SaveChangesAsync(cancellationToken);

由于有新的孩子,我无法更新实体。我应该如何在根目录中保存修改?

我正在使用CQRS,并且试图在命令中添加新的费率。我应该创建一个存储库吗?

1 个答案:

答案 0 :(得分:0)

每个集合应有一个存储库,因此您应该有一个会议室存储库。

但是存储库模式是对象集合的抽象,您没有任何更新方法,只需添加,删除和获取即可。

要更新对象,只需从存储库中获取并修改它即可。

实施存储库的持久性机制将负责跟踪对对象(包括根的子对象)所做的更改,将其包装在事务中并进行提交以将其保存到数据库。

请参见http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/

希望有帮助。