0

我有一个存储在会话中的自定义实体的列表,以便用户可以在 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. 

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

4

1 回答 1

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});
}
于 2013-07-12T12:29:36.173 回答