检测数据库条目中的更改

本文关键字:数据库 检测 | 更新日期: 2024-10-26 05:16:43

是否有任何内置的可能性可以检测,如果数据库上的POCO条目发生了变化?
例如:

  1. 用户 1 编辑 ID 为 1 的对象。
  2. 用户 2 还编辑 ID 为 1 的对象并保存。
  3. 用户
  4. 1 还会保存并覆盖用户 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; }
}

但是,这样做了,我不推荐它。其他人可能不同意,但我认为您应该只在有充分理由的情况下对实体强制执行并发性。

不知道

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

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