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

Guid值无法正确插入Cassandra表问题排查求助

Cassandra插入DumpsysLog表时Guid全为0的问题排查与解决

问题场景

在单元测试中使用静态类TestBase复用测试数据,Cassandra部署在Docker容器内。执行数据插入时,TestRunById表的Guid插入正常,但DumpsysLog表的Guid始终为全0(00000000-0000-0000-0000-000000000000)。

相关代码

静态测试类TestBase

public static class TestBase
{
    public static readonly string Testrunid1 = "88c93395-3b35-4b58-9b5a-b6ab150044532";
    public static readonly DateTime Timestamp1 = DateTime.Parse("2023-09-15T11:30:42");
    public const int LogItemsNumber = 10;
    public const string TestString =
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi feugiat, diam sit amet sodales porttitor, lectus libero dapibus eros, quis venenatis nunc dui sit amet nunc. Etiam tincidunt dolor enim, dapibus gravida lacus ullamcorper vel. ";

    public const int IndexedLinesNumber = 12000;
    public static DateTime TimestampGenerator(int iteration)
    {
        var timestamp = Timestamp1;
        return timestamp.Add(TimeSpan.FromSeconds(3 * iteration));
    }

    public static IEnumerable<DumpsysData> CreateEnumerableOfDumpSysItems()
    {
        for (var i = 0; i < LogItemsNumber; i++)
        {
            yield return new DumpsysData(
                Guid.Parse(Testrunid1),
                i,
                TimestampGenerator(i),
                CreateLines(),
                CreateTableLines()
            );
        }
    }
    public static List<IndexedLine> CreateLines() 
    {
        var listOfLines = new List<IndexedLine>();
        for (var i = 0; i < IndexedLinesNumber; i++)
        {
            listOfLines.Add(new IndexedLine(i, TestString));
        }

        return listOfLines;
    }

    public static Dictionary<string, IndexedLine> CreateTableLines() 
    {
        var listOfTableLines = new Dictionary<string, IndexedLine>();
        for (var i = 0; i < IndexedLinesNumber; i++)
        {
            if (i % 1000 == 0)
            {
                listOfTableLines.Add($"Test{i}", new IndexedLine(i, TestString));
            }
        }

        return listOfTableLines;
    }
}

测试数据插入方法

private async Task CreateTestDumpSysDataRows()
{
    var testRunHeader = new TestRunHeader(Guid.Parse(TestBase.Testrunid1), "TestProject", "TestVersion");
    await _analysisSession.TestRunsById.Insert(testRunHeader).ExecuteAsync();
    using var iterator = TestBase.CreateEnumerableOfDumpSysItems().GetEnumerator();

    while (iterator.MoveNext())
    {
       await _session.DumpsysLog.Insert(iterator.Current).ExecuteAsync();
    }
}

问题原因分析

1. 测试Guid字符串格式错误

观察TestBase中的Testrunid1值:"88c93395-3b35-4b58-9b5a-b6ab150044532",标准Guid格式为8-4-4-4-12共36个字符,而该字符串最后一段为13位(b6ab150044532),不符合规范。

若直接调用Guid.Parse处理该字符串,理论上会抛出FormatException;但如果代码存在异常捕获逻辑,或使用Guid.TryParse未处理解析失败的情况,会返回Guid.Empty(全0 Guid),最终导致插入DumpsysLog表的Guid为全0。

2. DumpsysData类构造函数未正确赋值Guid

假设DumpsysData的构造函数未将传入的Guid参数赋值给对应实体属性,例如:

public class DumpsysData
{
    public Guid TestRunId { get; set; }
    // 其他属性

    // 错误示例:遗漏Guid赋值
    public DumpsysData(Guid testRunId, int sequence, DateTime timestamp, ...)
    {
        // 仅赋值其他属性,未设置TestRunId = testRunId;
    }
}

这种情况下,TestRunId会保持默认值Guid.Empty,插入Cassandra时自然显示为全0。

3. Cassandra实体映射不匹配

若DumpsysData类的Guid属性与DumpsysLog表的列名未正确映射,例如:

  • Cassandra表列名为test_run_id,但实体属性名为RunId,且未通过特性或Fluent配置指定映射关系,Cassandra驱动无法识别该属性对应的列,插入时未写入Guid值,最终存储为默认全0。

解决方法

针对原因1:修正Guid字符串格式

将Testrunid1修改为符合标准格式的Guid,例如去掉最后多余字符:

public static readonly string Testrunid1 = "88c93395-3b35-4b58-9b5a-b6ab15004453";

或直接生成合法Guid:

public static readonly Guid Testrunid1 = Guid.NewGuid();

针对原因2:完善DumpsysData构造函数

确保构造函数将传入的Guid参数赋值给对应实体属性:

public class DumpsysData
{
    public Guid TestRunId { get; set; }
    public int Sequence { get; set; }
    public DateTime Timestamp { get; set; }
    // 其他属性

    public DumpsysData(Guid testRunId, int sequence, DateTime timestamp, List<IndexedLine> lines, Dictionary<string, IndexedLine> tableLines)
    {
        TestRunId = testRunId; // 关键:添加Guid赋值逻辑
        Sequence = sequence;
        Timestamp = timestamp;
        // 其他属性赋值
    }
}

针对原因3:修正实体与表的映射关系

特性方式

using Cassandra.Mapping.Attributes;

public class DumpsysData
{
    [Column("test_run_id")] // 指定对应Cassandra表的列名
    public Guid TestRunId { get; set; }
    // 其他属性
}

Fluent配置方式

// 会话初始化时配置映射
var mappingConfig = new MappingConfiguration();
mappingConfig.Define(new Map<DumpsysData>()
    .TableName("DumpsysLog")
    .Column(d => d.TestRunId, cm => cm.WithName("test_run_id")));
var session = Cluster.Builder().AddContactPoints("localhost").Build().Connect("keyspace");
var mapper = new Mapper(session, mappingConfig);

内容的提问来源于stack exchange,提问作者Panda153

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:50:01