使用实体框架 6 获取 RowVersion 的新值


是否可以

使用相同的 DbContext 获取 RowVersion 的新值,而无需从数据库重新加载实体?

场景:

  • 将数据加载到编辑器窗体中
  • 保存新值
  • 表中的行得到更新,生成了 RowVersion 的新值
  • 但是,保存的实体仍保留 RowVersion 的旧值,因此新值无法传递回客户端

所有并发控制文章通常只关注阻止更新(例如,请参阅此处)。但是,在本文的示例中,成功更新后会重定向到页面,在该页面中,将再次读取保存的实体,现在它具有新的 RowVersion 值。我想避免这种重定向。

多亏

了grennis,我找到了问题的根源。

我定义了接口和一个实体,例如

public interface IRowVersion
{
    // Attention: this will not be "inherited" by the implementing class !!!
    [Timestamp]
    byte[] VersionStamp { get; set; }
}
public class Directory : IRowVersion
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    // If this attribute is missing here, then row version is used
    // My initial version was without this attribute
    [Timestamp]
    public byte[] VersionStamp { get; set; }
}

在我的有问题的版本中,我认为在接口属性上拥有属性就足够了。但是,必须将属性显式应用于实体的属性。否则,它根本不会被使用(甚至不作为更新 SQL 语句的一部分)。该值被更新只是因为数据库自动更新了列值,当然,在下次读取时,我得到了新值。

与问题不完全相关,但仍然值得一提...以下真的是EF6的杀手锏

ctx.Database.Log = s => Debug.Write(s);

SQL探查器,很高兴认识你:-)

最新更新