将Rowversion与EF Core和SQLite一起使用时,DbUpdateConcurrencyException

时间:2018-10-24 21:16:18

标签: c# entity-framework entity-framework-core rowversion

我正在尝试在ef核心中创建具有乐观并发性的表,但是现在我总是遇到spring mvc enums case insensitive是“好”的,因为当我遇到并发性问题时我希望此异常。我的上下文如下:

DbUpdateConcurrencyException

我在这样的存储库中称呼它:

public sealed class QueryStorageContext : DbContext
    {
        public DbSet<QueryDbo> Querries { get; set; }

        public QueryStorageContext(DbContextOptions<QueryStorageContext> options) :
            base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<QueryDbo>()
                .Property(b => b.RowVersion)
                .IsRowVersion()
                .ValueGeneratedOnAddOrUpdate()
                .HasDefaultValueSql("CURRENT_TIMESTAMP");
        }
    }

    public class QueryDbo
    {
        [Key]
        public string Type { get; set; }
        public string Payload { get; set; }
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }

我使用它的地方看起来像这样:

public async Task<T> Load<T>() where T : Query
    {
        var name = typeof(T).Name;
        var query = await _context.Querries.FirstOrDefaultAsync(queryDbo => queryDbo.Type == name);
        if (query == null) return null;
        var data = _converter.Deserialize<T>(query.Payload);
        data.Version = query.RowVersion;
        return data;
    }

    public async Task Save(Query query)
    {
        var queryDbo = new QueryDbo
        {
            Type = query.Type,
            RowVersion = query.Version,
            Payload = _converter.Serialize(query)
        };

        var firstOrDefault = _context.Querries.FirstOrDefault(q => q.Type == query.Type);
        if (firstOrDefault != null)
        {
            firstOrDefault.Payload = _converter.Serialize(query);
            _context.Update(firstOrDefault);
        }
        else await _context.Querries.AddAsync(queryDbo);

        await _context.SaveChangesAsync();
    }

我认为问题可能是,我不在同一范围内使用上下文,或者重新创建了与从数据库加载的对象不同的新对象。但是我不明白为什么这会给我一个例外,因为即使它来自另一个对象,行版本仍然相同。

我在这里怎么了?

0 个答案:

没有答案