我有这个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,并且试图在命令中添加新的费率。我应该创建一个存储库吗?
答案 0 :(得分:0)
每个集合应有一个存储库,因此您应该有一个会议室存储库。
但是存储库模式是对象集合的抽象,您没有任何更新方法,只需添加,删除和获取即可。
要更新对象,只需从存储库中获取并修改它即可。
实施存储库的持久性机制将负责跟踪对对象(包括根的子对象)所做的更改,将其包装在事务中并进行提交以将其保存到数据库。
请参见http://codebetter.com/iancooper/2011/04/12/repository-saveupdate-is-a-smell/
希望有帮助。