0

ユーザーが asp.net mvc Web サイトのデータをページングできるように、セッションに保存するカスタム エンティティのリストがあります。ユーザーはこのリストを編集していませんが、すべてに目を通してから承認します。

 List<scholarship> ss = x.scholarshipSet.Where(m => m.requriements != null).ToList();

 Session["ListOfScholarships"] = ss;

彼らがリストに目を通し、承認されたことを確認したら、承認された日付をマークします。

CrmDataContext x = new CrmDataContext();
List<scholarship> ss = (List<scholarship>)Session["ListOfScholarships"];
DateTime n = DateTime.Now;

    foreach (scholarship s in ss) {
        s.Approved = n;
           if (!x.IsAttached(s)) {
                 x.Attach(s);
             }
               x.UpdateObject(s);
      }
     x.SaveChanges();

コードのこの部分

if (!x.IsAttached(s)) {
     x.Attach(s);
}

正しく動作していません。エンティティが既にアタッチされているかどうかを具体的にチェックするifステートメント内に入り、エラーをスローします

The 'scholarship' entity is already attached to a context. 

セッションを使用しない場合、これは発生しません。エンティティが接続されていないと一瞬思って、次に接続されていることに気付くのはどうしてでしょうか? セッションがこの問題を引き起こすのはなぜですか?

4

1 に答える 1

0

エンティティをセッションに保存するには、シリアル化する必要があります。CRMがエンティティがコンテキスト内にあるかどうかを判断するために使用する情報を何らかの形で混乱させているのではないかと思います. 更新に Context を使用する代わりに、基になる IOrgranizationalService を使用できます。

foreach (scholarship s in ss) {
    // Create a new object just in case someone has edited some other field on the object since it was retrieved.
    // This keeps the updated field from being overridden
    service.Update(new scholarship(){ Id = s.Id, Approved = n});
}
于 2013-07-12T12:29:36.173 に答える