PostgreSQL实体框架上的RowVersion实现

时间:2017-03-07 14:40:36

标签: postgresql entity-framework optimistic-concurrency rowversion

我正在使用Entity Framework 6和PostgreSQL。 我有一个实体,我希望防止并发问题,在this documentation之后我添加了一个带有[Timestamp]属性的RowVersion属性,但是在保存对实体的更改后,列RowVersion值在数据库中保持不变。

    [Timestamp]
    public byte[] RowVersion { get; set; }

我是否遗漏了某些内容,或者是否有另一种方法可以在PostgreSQL中处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

/// <summary>
/// Meant to validate concurrency en database update
/// This column is updates itself in database and only works in postgresql
/// </summary>
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
//[NotMapped]
public string xmin { get; set; }

只是为了不在迁移中添加的列添加[NotMapped]属性,在数据库更新后对其进行了评论。

答案 1 :(得分:0)

只是其他人在这里徘徊的EF Core更新答案。

Npgsql框架使用OP在其实体中用作NotMapped属性的隐藏系统列 xmin 对此提供了内置支持。

如所引用的here一样,您可以通过Fluent API在实体的UseXminAsConcurrencyToken方法中调用实体上的OnModelCreating方法(数据注释,将xmin列设置为EF中的并发令牌)据我所知,目前暂时无法使用。

对于已经使用Fluent API配置的任何人,就这么简单:

public class AwesomeEntityConfiguration : IEntityTypeConfiguration<AwesomeEntity>
{
    public void Configure(EntityTypeBuilder<AwesomeEntity> builder)
    {
        builder.ToTable("Awesomeness");
        builder.HasKey(pk => pk.Id);
        // ADD THIS LINE
        builder.UseXminAsConcurrencyToken();

        builder.Property(p => p.IsAwesome)
            .IsRequired();
    }
}