C# 具有条件更新的DynamoDBVersion属性

C# 具有条件更新的DynamoDBVersion属性,c#,amazon-dynamodb,aws-sdk,C#,Amazon Dynamodb,Aws Sdk,我正在使用带有DynamoDB的,并且正在使用内置的DynamoDBVersion属性 [DynamoDBTable("items")] public class MyItem { [DynamoDBHashKey] public string Id { get; set; } [DynamoDBVersion] public int? Version { get; set; } } 保存操作 使用DynamoDBContext很简单 await _dbCon

我正在使用带有DynamoDB的,并且正在使用内置的
DynamoDBVersion
属性

[DynamoDBTable("items")]
public class MyItem
{
    [DynamoDBHashKey]
    public string Id { get; set; }

    [DynamoDBVersion]
    public int? Version { get; set; }
}
保存操作 使用
DynamoDBContext
很简单

await _dbContext.SaveAsync(item);
最近,我添加了一个自定义更新条件,将保存操作更改为以下内容

var table = _dbContext.GetTargetTable<MyItem>();
await table.UpdateItemAsync(_dbContext.ToDocument(item), new UpdateItemOperationConfig
{
    ConditionalExpression = ...
});
var table=_dbContext.GetTargetTable();
wait table.UpdateItemAsync(_dbContext.ToDocument(item),new UpdateItemOperationConfig
{
条件表达=。。。
});

这似乎破坏了内置的乐观锁定,表中的任何项都不包含
Version
属性。是否有任何方法可以将该属性与条件写入一起使用,或者以某种方式使用低级.NET SDK手动实现乐观锁定?

您希望在条件表达式中添加什么?您必须具有对象客户端,否则乐观锁定将阻止更新的发生。那么您应该能够在客户端执行任何条件检查


请明确,在使用乐观锁定保存对象之前,必须先加载对象。是否先加载对象?

我认为不必先加载对象-在这种情况下,保存时
Version
null
,Dynamo会增加表中的值。我的一些更新是读更新写的,有些只是写的。该条件适用于所有操作,但读更新写情况需要乐观锁定。我仍然不理解。要么加载项目,要么在客户端进行检查,要么更新项目。在这种情况下,您不需要条件运算符,因为乐观锁定会阻止您更新错误的项。或者在不首先加载的情况下强制保存,在这种情况下,您将覆盖任何现有项,因此不需要条件表达式。你能描述一下你的情况吗?当然!多个处理程序处理带有序列号的事件并更新读取模型。事件必须按顺序应用于读取模型。每个项目都包含要更新的最新事件的序列号。该条件确保任何更新都会将序列号精确增加1。仅此条件不能保证另一个处理程序在读更新写期间没有更新项。实际上,我可以通过在读取后在客户端上检查序列号,然后在写入时在DB中再次检查序列号来解决这个问题,但是如果可能的话,我宁愿使用内置的乐观锁定。您应该只能在客户端执行检查。因此,您有一个事件要处理,您加载读取模型,检查事件序列号是否正确(假设正确),然后保存读取模型。您不需要更新条件,因为您知道持久化读取模型与客户端对象相同(否则保存将失败)。然后您有另一个事件要处理,加载读取模型,该事件没有顺序,因此不要尝试保存。您需要处理另一个事件,加载模型,序列正常,保存,数据库模型已被另一个处理程序更改,因此保存失败。是的,这样可以正常工作,但这意味着每次更新项目时我都必须进行读取。DB中发生的条件更新意味着我可以避免读取大多数事件。当然,有一些方法可以在不使用乐观锁定功能的情况下实现我所追求的目标——但我的问题是,我是否可以在条件更新的同时使用乐观锁定,这样我就不必向客户端代码添加额外的逻辑了。我怀疑答案是否定的。