C#/.NET中DynamoDB对象持久化模型如何自动管理CreatedDate与LastUpdatedDate?
在C#/.NET中自动管理DynamoDB的CreatedDate和LastUpdatedDate属性
由于AWS SDK for .NET的DynamoDB对象持久化模型没有内置的自动时间戳属性,你可以通过以下几种方式实现自动管理:
1. 实体基类+前置处理
定义包含时间属性的基类,在保存前统一设置时间:
public abstract class BaseDynamoEntity { public DateTime CreatedDate { get; set; } public DateTime LastUpdatedDate { get; set; } // 保存前调用此方法 public void PrepareForSave() { var now = DateTime.UtcNow; if (CreatedDate == default) { CreatedDate = now; } LastUpdatedDate = now; } } // 业务实体继承基类 public class User : BaseDynamoEntity { public string Id { get; set; } public string Name { get; set; } }
使用时只需在保存前调用PrepareForSave:
var user = new User { Id = "123", Name = "Alice" }; user.PrepareForSave(); await _dynamoDbContext.SaveAsync(user);
2. 封装通用保存方法
把时间设置逻辑封装到通用的数据访问方法中,避免重复代码:
public async Task SaveEntityAsync<T>(T entity) where T : class { var now = DateTime.UtcNow; var type = typeof(T); // 设置CreatedDate(仅当值为空时) var createdProp = type.GetProperty("CreatedDate"); if (createdProp != null && createdProp.GetValue(entity) == null) { createdProp.SetValue(entity, now); } // 强制更新LastUpdatedDate var updatedProp = type.GetProperty("LastUpdatedDate"); if (updatedProp != null) { updatedProp.SetValue(entity, now); } await _dynamoDbContext.SaveAsync(entity, new DynamoDBOperationConfig { SaveBehavior = SaveBehavior.UpdateSkipNullAttributes }); }
调用时直接传入实体即可:
await SaveEntityAsync(new User { Id = "123", Name = "Alice" });
3. 使用AWS SDK拦截器(全局生效)
通过拦截器在请求发送到DynamoDB前自动修改请求参数,全局处理所有Put/Update操作:
public class TimestampInterceptor : IAmazonDynamoDBInterceptor { public void BeforeExecute(IExecutionContext executionContext) { var utcNow = DateTime.UtcNow.ToString("o"); // ISO 8601格式 if (executionContext.Request is PutItemRequest putReq) { // 新增时自动添加CreatedDate(如果不存在) if (!putReq.Item.ContainsKey("CreatedDate")) { putReq.Item["CreatedDate"] = new AttributeValue { S = utcNow }; } // 强制设置LastUpdatedDate putReq.Item["LastUpdatedDate"] = new AttributeValue { S = utcNow }; } else if (executionContext.Request is UpdateItemRequest updateReq) { // 更新时追加LastUpdatedDate的更新逻辑 updateReq.ExpressionAttributeValues[":updatedDate"] = new AttributeValue { S = utcNow }; updateReq.UpdateExpression = string.IsNullOrEmpty(updateReq.UpdateExpression) ? "SET LastUpdatedDate = :updatedDate" : $"{updateReq.UpdateExpression}, LastUpdatedDate = :updatedDate"; } } // 实现其他接口方法(空实现即可) public void AfterExecute(IExecutionContext executionContext) { } public Task BeforeExecuteAsync(IExecutionContext executionContext, CancellationToken cancellationToken) { BeforeExecute(executionContext); return Task.CompletedTask; } public Task AfterExecuteAsync(IExecutionContext executionContext, CancellationToken cancellationToken) => Task.CompletedTask; }
注册拦截器到DynamoDB客户端:
var dynamoClient = new AmazonDynamoDBClient() .WithInterceptor(new TimestampInterceptor()); var dbContext = new DynamoDBContext(dynamoClient);
之后所有通过该客户端的Put/Update操作都会自动处理时间戳。
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

