我正在尝试在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();
}
我认为问题可能是,我不在同一范围内使用上下文,或者重新创建了与从数据库加载的对象不同的新对象。但是我不明白为什么这会给我一个例外,因为即使它来自另一个对象,行版本仍然相同。
我在这里怎么了?