2011-07-07 41 views
1

我已經聚集命名爲廣告活動中的實體每一個,這根實體有嘗試的列表(實體)使用方法添加一個如何與根實體命名活動更新彙總

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"); 
} 

任何幫助將不勝感激!

感謝, 佩德羅·德·克魯斯

回答

3

首先,我認爲您的域模型可能存在一個小問題。在我看來,像「運動」應該是具有「嘗試」值對象(或實體)的集合的聚合根實體。除非您對包含廣告系列集合的廣告​​系列有一個父級概念,否則沒有「廣告系列」聚合。此外,沒有「嘗試」實體。而是在「廣告系列」實體上收集「嘗試」實體或值。 「嘗試」可以是一個實體,如果它有一個「廣告活動」以外的身份,否則它是一個值對象。該代碼可以像這樣的事情:

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

如果您檢索活動實體的嘗試,然後改變一些屬性的,你不應該將其插回活動的實體,它已經存在。這是如果你使用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

你不需要的編輯方法。您的代碼可以修改嘗試原地的,就像這樣:

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

當然,你是如何命名的SaveChanges()的是你的,這是這樣的實體框架名的一般保存方法。