繁体   English   中英

LINQ to SQL-使用OnPropertyChanged更新时“未找到或更改行”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM