会话中存储的数据不会正确检测上下文附件

时间:2013-07-11 16:40:46

标签: dynamics-crm-2011

我有一个我存储在会话中的自定义实体列表,因此用户可以在asp.net mvc网站中浏览数据。用户不会编辑此列表,但会在查看完所有内容后批准该列表。

 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. 

如果我不使用会话,则不会发生这种情况。怎么会一秒钟认为实体没有附加,然后意识到它附加了下一个?为什么会话会导致这个问题?

1 个答案:

答案 0 :(得分:0)

为了将实体存储在会话中,必须将其序列化。我想知道是否某种方式弄乱了CRM用来确定实体是否在上下文中的信息。您可以使用底层的IOrgranizationalService。而不是使用Context进行更新。

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