[英]LINQ to SQL - “Row not found or changed” when updated using OnPropertyChanged
以下代码中的Save方法失败,并显示错误“找不到或更改行”。
Question question = questionService.getQuestionById(id);
// returning Context.Question.Where(q => q.id == id).SingleOrDefault()
question.Text = "some text";
questionService.Save(question);
// Context.SubmitChanges();
问题是使用CodeSmith和PLINQO模板生成的DTO。 但是,仅在实现对OnPropertyChanged事件的自定义替代以在创建或修改记录时自动插入之后,才会发生“找不到或更改行”错误。 我分析了生成的查询,当执行getQuestionById方法时,它正在执行普通的select语句。 但是,如果修改日期返回为'2012-07-28 12:15:00.900',则当我尝试保存记录时,更新失败,因为它添加了Modified ='2012-07-28 12:15: 00.903'到更新语句,这与数据库中存在的毫秒数有所不同。 所以我知道这与添加到生成的Question对象中的以下代码有关:
protected override void OnPropertyChanged(string property)
{
this.UpdateProperties(property);
base.OnPropertyChanged(property);
}
public static void UpdateProperties(this object updatedObject, string property)
{
if (property == created || property = modified) return;
// prevents an infinite loop
Update(updateObject);
// sets updatedObject.Created and updateObject.Modified fields
}
我发现一些帖子建议将精度高于秒的字段的dbml中的UpdateMode设置为never。 我可以将其作为最后的手段,但是一段时间以来,我一直在将相同的代码添加到具有相同数据类型的其他表中,而没有任何问题,并且想了解为什么仅在该表中发生这种情况。 这似乎也随机地失败了,我没有特定的步骤来重现它,但是当我不调试时,它的确似乎更频繁地发生。
我的猜测是您正在使用数据库中的“修改(和/或创建)”列来检查并发性。 您还将自己更新此列。 这种混合是不正确的。
更好的方法是将时间戳用作并发检查列。 该列将由SQL Server设置(假设这是您正在使用的列),它不是日期时间,而是一些内部唯一数据库生成的值。
进行了一些谷歌搜索为我提供了这篇文章,我认为它将很好地解释有关如何设置时间戳列的基础知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.