3

キャンペーンという名前のルート エンティティを持つ Campaigns every という名前の集計があります。このルート エンティティには試行のリスト (エンティティ) があります。

    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 で Attempt を取得し、それを editAttempt メソッドに渡しますが、リスト全体を削除せずに試行を設定して再作成する方法がわかりません

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

どんな助けでも大歓迎です!

ありがとう、ペドロ・デ・ラ・クルス

4

2 に答える 2

2

まず、ドメイン モデルに少し問題があると思います。「キャンペーン」は、「試行」値オブジェクト (またはエンティティ) のコレクションを持つ集約ルート エンティティである必要があるように思えます。キャンペーンのコレクションを含むキャンペーンの親概念がない限り、「キャンペーン」集計はありません。また、「試行」エンティティはありません。代わりに、「試行」エンティティまたは「キャンペーン」エンティティの値のコレクション。「試行」は、「キャンペーン」の外部に ID がある場合はエンティティである可能性があり、それ以外の場合は値オブジェクトです。コードは次のようになります。

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

キャンペーン エンティティから Attempt を取得し、いくつかのプロパティを変更した場合、それをキャンペーン エンティティに挿入し直す必要はありません。それは既にそこにあります。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 
于 2011-07-07T22:40:22.423 に答える
-1

Editメソッドは必要ありません。コードは、次のように、その場で試行を変更できます。

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

もちろん、SaveChanges()にどのように名前を付けるかはあなた次第です。これは、EntityFrameworkがその一般的なSaveメソッドに名前を付ける方法です。

于 2011-07-07T22:35:14.870 に答える