集合 CassandraCSharpDriver 中不允许使用非冻结的 UDT
Non-frozen UDTs are not allowed inside collections CassandraCSharpDriver
我是 cassandra,用于自定义记录我的 .netcore
项目,我正在使用 CassandraCSharpDriver。
问题:
我在日志中为参数创建了 UDT,并在日志 table 中添加了 paramUDT 列表作为冻结。
但我收到错误:Non-frozen UDTs are not allowed inside collections
。我不知道为什么我会收到此错误,因为我在日志模型中使用的列表中使用了 Frozen 属性。
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; }
}
问题是我哪里做错了,是我的 UDT 脚本不正确还是需要更改模型。
提前致谢
我已经尝试使用该模型并 Table.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; }
}
请注意,我必须添加 PartitionKey
属性,否则它不会 运行。
这是它生成的 CQL 语句:
CREATE TABLE Log (
LoggingLevel int,
UserId uuid,
TimeZone text,
Text text,
LogParams frozen<list<"testks"."logparamscudt">>,
PRIMARY KEY (Text)
)
如果我删除 Frozen
属性,则会出现此错误:Cassandra.InvalidQueryException: 'Non-frozen collections are not allowed inside collections: list<testks.logparamscudt>'
.
如果您打算拥有这样的列 LogParams frozen<list<"testks"."logparamscudt">>
,那么 Frozen
属性将起作用。相反,如果您只想冻结 UDT,即 LogParams list<frozen<"testks"."logparamscudt">>
,那么据我所知,Frozen
属性将不起作用,您不能依赖驱动程序生成 CREATE
语句给你。
我所有的测试都是针对 cassandra 3.0.18
使用最新的 C# 驱动程序 (3.10.1
) 完成的。
我是 cassandra,用于自定义记录我的 .netcore
项目,我正在使用 CassandraCSharpDriver。
问题:
我在日志中为参数创建了 UDT,并在日志 table 中添加了 paramUDT 列表作为冻结。
但我收到错误:Non-frozen UDTs are not allowed inside collections
。我不知道为什么我会收到此错误,因为我在日志模型中使用的列表中使用了 Frozen 属性。
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; }
}
问题是我哪里做错了,是我的 UDT 脚本不正确还是需要更改模型。
提前致谢
我已经尝试使用该模型并 Table.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; }
}
请注意,我必须添加 PartitionKey
属性,否则它不会 运行。
这是它生成的 CQL 语句:
CREATE TABLE Log (
LoggingLevel int,
UserId uuid,
TimeZone text,
Text text,
LogParams frozen<list<"testks"."logparamscudt">>,
PRIMARY KEY (Text)
)
如果我删除 Frozen
属性,则会出现此错误:Cassandra.InvalidQueryException: 'Non-frozen collections are not allowed inside collections: list<testks.logparamscudt>'
.
如果您打算拥有这样的列 LogParams frozen<list<"testks"."logparamscudt">>
,那么 Frozen
属性将起作用。相反,如果您只想冻结 UDT,即 LogParams list<frozen<"testks"."logparamscudt">>
,那么据我所知,Frozen
属性将不起作用,您不能依赖驱动程序生成 CREATE
语句给你。
我所有的测试都是针对 cassandra 3.0.18
使用最新的 C# 驱动程序 (3.10.1
) 完成的。