使用相同的 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探查器,很高兴认识你:-)