使用Entity Framework 6获取RowVersion的新值

时间:2014-01-02 02:29:38

标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

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

情景:

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

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

1 个答案:

答案 0 :(得分:1)

感谢格林尼斯,我找到了问题的根源。

我定义了界面和像

这样的实体
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语句的一部分)。该值只是因为DB自动更新列值而更新,当然,在下次读取时,我得到了新值。

与问题不完全相关,但仍值得一提......以下是EF6的杀手级功能

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

SQL事件探查器,很高兴知道你: - )