如何更新Aggregate中的实体

时间:2011-07-07 22:27:06

标签: domain-driven-design ddd-repositories

我有一个名为Campaigns的聚合,每个都有一个名为campaign的根实体,这个root实体有一个尝试列表(entity)

 
    public class Attempts: IEntity<Attempts>
    {
        private int id;
        public AttempNumber AttemptNumber {get;}
        //other fields 
    }

    public class Campaign: IEntity<Campaign> //root
    {
        private int id;
        public IList<Attempt> {get;}
        //other fields 
    }

我正在使用一种方法来添加广告系列尝试

 public virtual void AssignAttempts(Attempts att)
        {
            Validate.NotNull(att, "attemps are required for assignment");

            this.attempts.add(att);
        }

当我尝试编辑尝试列表中的特定项目时出现问题。我通过AttempNumber尝试并将其传递给editAttempt方法,但我不知道如何设置尝试而不删除整个列表并重新创建它

 public virtual void EditAttempts(Attempts att)
 {
        Validate.NotNull(att, "attemps are required for assignment");
 }

任何帮助将不胜感激!

谢谢, 佩德罗·德拉克鲁兹

2 个答案:

答案 0 :(得分:3)

首先,我认为您的域模型可能存在轻微问题。在我看来,'Campaign'应该是具有“尝试”值对象(或实体)集合的聚合根实体。除非您对包含广告系列集合的广告​​系列有父级概念,否则不会有“广告系列”汇总。此外,没有“尝试”实体。而是“广告系列”实体上的“尝试”实体或值的集合。如果“尝试”在“广告系列”之外具有标识,则“尝试”可能是实体,否则它是值对象。代码可能是这样的:

class Campaign {

public string Id { get; set; }

public ICollection<Attempt> Attempts { get; private set; }

public Attempt GetAttempt(string id) {
return this.Attempts.FirstOrDefault(x => x.Number == id);
}

}

class Attempt {
public string Number { get; set; }
public string Attribute1 { get; set; }
}

如果您从Campaign实体中检索尝试然后更改某些属性,则不必将其重新插入到广告系列实体中,它已经存在。如果您使用NHibernate(类似于其他ORM),这就是代码的外观:

var campaign = this.Session.Get<Campaign>("some-id");

var attempt = campaign.GetAttempt("some-attempt-id");

attempt.Attribute1 = "some new value";

this.Session.Flush(); // will commit changes made to Attempt 

答案 1 :(得分:1)

您不需要Edit方法。您的代码可以就地修改Attempts,如下所示:

Attempt toModify = MyRepository.GetAttemptById(id);
toModify.Counter++;
toModify.Location = "Paris";
MyRepository.SaveChanges(); // to actually persist to the DB

当然,你如何命名SaveChanges()取决于你,这就是Entity Framework命名其常规Save方法的方式。