C# 检测数据库条目中的更改
如果DB上的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
POCO
条目发生更改,是否存在检测的内置可能性?例如:
所以我想要实现的是在保存更改之前,自动检查数据库中的对象是否发生了更改 我不知道任何内置方式,但我会选择添加审计字段的方式,如下文所述
实现并发令牌
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并询问另一个问题,即如何一次性将并发性全局应用于整个实体模型。