Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测数据库条目中的更改_C#_Entity Framework - Fatal编程技术网

C# 检测数据库条目中的更改

C# 检测数据库条目中的更改,c#,entity-framework,C#,Entity Framework,如果DB上的POCO条目发生更改,是否存在检测的内置可能性? 例如: 用户1编辑ID为1的对象 用户2还编辑ID为1的对象并保存 用户1还保存和覆盖用户2的更改 我尝试重新加载对象并进行比较,但这有点太复杂了 所以我想要实现的是在保存更改之前,自动检查数据库中的对象是否发生了更改 我不知道任何内置方式,但我会选择添加审计字段的方式,如下文所述 实现并发令牌 public class SomeEntity { public int ID { get; set; } public s

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

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


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

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


    实现并发令牌

    public class SomeEntity
    {
        public int ID { get; set; }
        public string SomeProperty { get; set; }
    
        [ConcurrencyCheck] 
        [Timestamp]
        public byte[] Version { get; set; }
    }
    
    在上述情况下,第三步永远不会发生。当第二个用户去保存他们的更改时,数据库将不允许这样做。当您尝试保存更改时,EF将引发并发异常,因为第二次编辑的版本不匹配。我相信确切的异常类型是
    DbUpdateConcurrencyException

    如果您正在使用fluent 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; }
    }
    

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

    谢谢!这正是我想要的。是否也有可能将此设置全局设置为整张表或甚至整张.edmx?我不这么认为,但我不确定。现在您已经知道如何为一个实体执行此操作,您可以搜索web并询问另一个问题,即如何一次性将并发性全局应用于整个实体模型。