2011-07-07 9 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"); 
} 
それを再作成する方法を知りません!あなたがEditメソッドを必要としない

おかげで、 ペドロ・デ・ラ・クルス

答えて

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

。あなたのコードはそうのように、インプレース試みを変更することができます(あなたがSaveChangesメソッドに名前を付ける方法もちろん

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

)これは、Entity Frameworkの名の一般的な保存方法の方法です、あなた次第です。

関連する問題