我正在尝试将 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
}
}
本地运行并调试:
马塞洛、阿南德,感谢您的意见。
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 服务器数据库获取的示例数据:
这里我使用了Dotnet 8版本,包括Azure Functions和相关库,已更新为与.NET 8.0兼容的版本。
参考:
JsonSerializerOptions
。
Azure Functions 在隔离工作线程模型中支持 .NET 8。