我有一个我存储在会话中的自定义实体列表,因此用户可以在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.
如果我不使用会话,则不会发生这种情况。怎么会一秒钟认为实体没有附加,然后意识到它附加了下一个?为什么会话会导致这个问题?
答案 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});
}