C# 集合CassandraCSharpDriver中不允许使用非冻结UDT

C# 集合CassandraCSharpDriver中不允许使用非冻结UDT,c#,asp.net-core,cassandra,cassandra-3.0,C#,Asp.net Core,Cassandra,Cassandra 3.0,我是cassandra,用于自定义记录我的.netcore项目,我使用的是CassandraCSharpDriver 问题: 我已经在日志中为params创建了UDT,并在日志表中添加了冻结的paramUDT列表。 但我得到了一个错误:非冻结UDT不允许在集合中使用。我不知道为什么会出现这个错误,因为我在日志模型中使用的列表中使用了冻结属性 logSession.Execute($"CREATE TYPE IF NOT EXISTS {options.Keyspaces.Log}.{nameof

我是cassandra,用于自定义记录我的
.netcore
项目,我使用的是CassandraCSharpDriver

问题: 我已经在日志中为params创建了UDT,并在日志表中添加了冻结的paramUDT列表。 但我得到了一个错误:
非冻结UDT不允许在集合中使用
。我不知道为什么会出现这个错误,因为我在日志模型中使用的列表中使用了冻结属性

logSession.Execute($"CREATE TYPE IF NOT EXISTS {options.Keyspaces.Log}.{nameof(LogParamsCUDT)} (Key text, ValueString text);");
以下是模型:

   public class Log
    {
        public int LoggingLevel { get; set; }
        public Guid UserId { get; set; }
        public string TimeZone { get; set; }
        public string Text { get; set; }
        [Frozen]
        public IEnumerable<LogParamsCUDT> LogParams { get; set; }
    }
公共类日志
{
公共int日志级别{get;set;}
公共Guid用户标识{get;set;}
公共字符串时区{get;set;}
公共字符串文本{get;set;}
[冻结]
公共IEnumerable LogParams{get;set;}
}
我哪里做错了,是我的UDT脚本不正确还是需要在模型中更改


提前感谢

我已经尝试使用该模型和
表。CreateIfNotExists
成功运行

代码如下:

public class Program
    {
        public static void Main()
        {
            var cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build();
            var session = cluster.Connect();
            session.CreateKeyspaceIfNotExists("testks");
            session.ChangeKeyspace("testks");
            session.Execute($"CREATE TYPE IF NOT EXISTS testks.{nameof(LogParamsCUDT)} (Key text, ValueString text);");
            session.UserDefinedTypes.Define(UdtMap.For<LogParamsCUDT>($"{nameof(LogParamsCUDT)}", "testks"));
            var table = new Table<Log>(session);
            table.CreateIfNotExists();
            table.Insert(new Log
            {
                LoggingLevel = 1,
                UserId = Guid.NewGuid(),
                TimeZone = "123",
                Text = "123",
                LogParams = new List<LogParamsCUDT>
                {
                    new LogParamsCUDT
                    {
                        Key = "123",
                        ValueString = "321"
                    }
                }
            }).Execute();
            var result = table.First(l => l.Text == "123").Execute();
            Console.WriteLine(JsonConvert.SerializeObject(result));
            Console.ReadLine();
            table.Where(l => l.Text == "123").Delete().Execute();
        }
    }

    public class Log
    {
        public int LoggingLevel { get; set; }
        public Guid UserId { get; set; }
        public string TimeZone { get; set; }
        [Cassandra.Mapping.Attributes.PartitionKey]
        public string Text { get; set; }
        [Frozen]
        public IEnumerable<LogParamsCUDT> LogParams { get; set; }
    }

    public class LogParamsCUDT
    {
        public string Key { get; set; }

        public string ValueString { get; set; }
    }
如果删除
freezed
属性,则会发生此错误:
Cassandra.InvalidQueryException:“不允许在集合内使用非冻结集合:列表”

如果您的目的是冻结像这样的列
LogParams
,则
freezed
属性将起作用。相反,如果您只希望冻结UDT,即
LogParams列表
,那么请确认
冻结
属性将不起作用,并且您不能依赖驱动程序为您生成
创建
语句


我所有的测试都是使用最新的C#驱动程序(
3.10.1
)对cassandra
3.0.18
进行的。

你能显示你的表定义吗?@AlexOtt我正在使用C创建表,创建表时出错。var Log=新表(logSession);Log.CreateIfNotExists();
CREATE TABLE Log (
    LoggingLevel int, 
    UserId uuid, 
    TimeZone text, 
    Text text, 
    LogParams frozen<list<"testks"."logparamscudt">>, 
    PRIMARY KEY (Text)
)