Azure SQL 触发器项在转换为隔离模型后包含空值

问题描述 投票:0回答:1

我正在尝试将 Azure 函数从 .Net6.0 和进程内模型转换为 .Net8.0 和隔离模型。

该函数在启用了更改跟踪的 Azure SQL 服务器数据库上使用 Azure SQL 触发器。当触发器触发时,将使用更改的数据对 Cosmos DB 中的容器进行更新。

使用 .Net6.0 和该函数的进程内模型可以正常工作。使用 .net8 和隔离模型,当对表进行更改时触发器会触发,但该项目包含所有字段的空值或默认值。进程内版本和隔离版本都使用相同的模型和 Dbcontext。

public async Task RunGroupTransformAsync([SqlTrigger("[FACETS].[CMC_GRGR_GROUP]", "CONNECTION-AZURE-SQL-RAW")] IReadOnlyList<SqlChange<CmcGrgrGroup>> changes,
 FunctionContext context)
{
   foreach (SqlChange<CmcGrgrGroup> change in changes)
   {  
     var logger = context.GetLogger("CmcGrgrGroup"); 
     logger.LogInformation($"Group Change operation: {change.Operation}");
     logger.LogInformation($"GrgrCk: {rawGroup.GrgrCk}");
     CmcGrgrGroup rawGroup = change.Item; 
     //Update Cosmos Container with rawGroup
    }
}

本地运行并调试:

Many of the fields in the Items should have values but none do.

c# azure triggers
1个回答
0
投票

马塞洛、阿南德,感谢您的意见。

  • 在隔离工作线程模型中,您可以为您的函数全局指定
    JsonSerializerOptions
    。配置选项以处理空值、属性命名和其他与序列化相关的设置。
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddHttpClient();
        // Define your global custom JSON serializer options
        services.Configure<JsonSerializerOptions>(options =>
        {
            options.AllowTrailingCommas = true;
            options.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
            options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
            options.PropertyNameCaseInsensitive = true;
        });
    });

我已经修改了日志配置,日志正在捕获预期的信息。

public async Task RunGroupTransformAsync([SqlTrigger("[FACETS].[CMC_GRGR_GROUP]", "CONNECTION-AZURE-SQL-RAW")] IReadOnlyList<SqlChange<CmcGrgrGroup>> changes,
    FunctionContext context)
{
    var logger = context.GetLogger("CmcGrgrGroup");

    foreach (SqlChange<CmcGrgrGroup> change in changes)
    {
        CmcGrgrGroup rawGroup = change.Item;

        logger.LogInformation($"Group Change operation: {change.Operation}");
        logger.LogInformation($"GrgrCk: {rawGroup?.GrgrCk}");

        // Update Cosmos Container with rawGroup
        await UpdateCosmosContainerAsync(rawGroup, logger);
    }
}

private async Task UpdateCosmosContainerAsync(CmcGrgrGroup rawGroup, ILogger logger)
{
    try
    {
        // Your Cosmos DB update logic here
        // Make sure to use rawGroup and logger as needed
        // ...
    }
    catch (Exception ex)
    {
        logger.LogError($"Error updating Cosmos Container: {ex.Message}");
        // Handle the exception accordingly
    }
}

针对 Azure SQL 服务器数据库获取的示例数据:

enter image description here

这里我使用了Dotnet 8版本,包括Azure Functions和相关库,已更新为与.NET 8.0兼容的版本。

enter image description here

参考:

© www.soinside.com 2019 - 2024. All rights reserved.