按预定义顺序更新行版本的实体框架

时间:2011-11-10 16:58:35

标签: c# sql-server entity-framework rowversion

我正在使用C#,EF和SQL Server,并且几乎没有父子关系表。有超过2个,但在这个例子中,为了简单起见,我将只使用2个。

表格书

Id
DateModified
RowVersion

表格页

Id
BookId - this is foreign key to Book.Id
RowVersion

当任何页面/页面更新时,我需要在Book表中更新DateModified

我们正在使用RowVersion来跟踪更改,因为它的独特价值我希望始终能够通过简单地执行类似

的操作来获取每本书的最新更改
SELECT * FROM Page
WHERE RowVersion > Book.RowVersion

但为了做到这一点,我需要确保RowVersion表中的Book始终在RowVersions Pages之前更新。

在我的EDM层中,我目前有类似的内容:

class Page
{
  void OnPageChanged() //this is hooked to OnPropertyChanged
  {
     this.Book.UpdateDateModified(DataTime.Now);
  }
}

执行此操作会导致页面首先更新,并且在事务提交后也会首先更新其RowVersion。这不是我需要的。

问题,如果我将移动OnPageChanged()来代替处理OnPropertyChanging事件 - 这是否可以保证一致性?是OnPropertyChanged是否规定了EF生成的sql中更新的顺序?针对此案例的其他任何建议?

1 个答案:

答案 0 :(得分:3)

我不认为这是可能的。我现在无法尝试,但我真的怀疑你可以比较Linq查询中的时间戳(RowVersion)。它映射到字节数组,字节数组不可比。数据库中的操作顺序完全不受您的控制。您不能将逻辑建立在实体更新的预期顺序上。只有当您的网页和图书将通过两个不同的SaveChanges来电保存时,您才能执行此操作。在这种情况下,您根本无法使用OnPropertyChanges,并且必须在对网页进行任何更改之前手动处理Book更改。