检测DB Entry中的更改

时间:2013-12-18 13:35:21

标签: c# entity-framework

如果DB上的POCO条目发生了变化,是否存在检测内置的可能性? 例如:

  1. 用户1编辑ID为1的对象。
  2. 用户2还编辑ID为1的对象并保存。
  3. 用户1还会保存并覆盖用户2的更改。
  4. 我尝试重新加载对象并进行比较,但这有点太复杂了。

    所以我想要实现的是在保存更改之前自动检查数据库中的对象是否发生了变化。

2 个答案:

答案 0 :(得分:2)

实现并发令牌。

public class SomeEntity
{
    public int ID { get; set; }
    public string SomeProperty { get; set; }

    [ConcurrencyCheck] 
    [Timestamp]
    public byte[] Version { get; set; }
}

通过上述步骤,第3步永远不会发生。当第二个用户去保存他们的更改时,数据库将不允许它。当您尝试保存更改时,EF将抛出并发异常,因为第二个编辑的版本不匹配。我相信确切的异常类型是DbUpdateConcurrencyException

如果您使用的是流畅的API,并且不希望在您的实体上使用这些属性,请执行以下操作:

Property(x => x.Version).IsConcurrencyToken(true).IsRowVersion();

<强>更新

我收回下面的评论,等等......

首先使用代码(不是EDMX),有一种方法可以全局应用这些属性。我做了一次,现在正试图慢慢地撤消它。您可以做的是实现一个抽象实体,然后让所有其他实体继承它:

public abstract class BaseEntity
{
    [ConcurrencyCheck] 
    [Timestamp]
    public byte[] Version { get; set; }

    // can also do this globally in FluentAPI with custom EntityTypeConfiguration
}

public class SomeEntity : BaseEntity
{
    public int ID { get; set; }
    public string SomeProperty { get; set; }
}

但是,完成此操作后,不推荐。其他人可能不同意,但我相信你应该只在有充分理由的情况下对实体实施并发。

答案 1 :(得分:0)

不知道任何构建方式,但我选择的方式是添加审计字段,如下文所述

http://www.jigar.net/articles/viewhtmlcontent344.aspx