You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:30:57