使用Datastax Cassandra . net Client创建表
本文关键字:创建 Client net Datastax Cassandra 使用 | 更新日期: 2023-09-27 18:18:35
我正在尝试DataStax Cassandra . net驱动程序,我正在尝试实现比字符串桶更复杂的东西(参见https://gist.github.com/peschkaj/5794713)。
当我尝试使用
创建表时var table = session.GetTable<SalesOrder>();
table.CreateIfNotExists();
我得到以下异常:
System.InvalidOperationException: Operation is not valid due to the current state of the object
at Cassandra.Data.Linq.CqlQueryTools.GetCqlTypeFromType (System.Type tpy) [0x00000] in <filename unknown>:0
at Cassandra.Data.Linq.CqlQueryTools.GetCreateCQL (ITable table) [0x00000] in <filename unknown>:0
at Cassandra.Data.Linq.Table`1[CassandraTest.SalesOrder].Create (ConsistencyLevel consictencyLevel) [0x00000] in <filename unknown>:0
at Cassandra.Data.Linq.Table`1[CassandraTest.SalesOrder].CreateIfNotExists (ConsistencyLevel consictencyLevel) [0x00000] in <filename unknown>:0
at CassandraTest.MainClass.Main (System.String[] args) [0x00056] in /Users/jeremiah/Projects/CassandraTest/CassandraTest/Program.cs:71
操作失败,部分原因是DateTime
,部分原因是自定义类型。使用c#驱动程序将复杂对象保存回Cassandra的合适语法/模式等是什么?
查看代码,似乎驱动程序只有timestamp
-> DateTimeOffset
类型的映射(参见代码)。如果您将DateTime
对象更改为DateTimeOffset
,则可以解决该问题。但是,我对他们忽略了DateTime
类型的映射这一事实并不感到兴奋。
驱动程序不理解您嵌套的复杂类型Address
或LineItem
,也没有内置的方法(ORM)让它做到这一点。我看到两个选项:
- 序列化你的对象成JSON,然后列"值"可以只是你的JSON字符串。在获取时,您将从JSON中重新生成。net对象。这就是我们在CQL 2.0实现中所做的,也是CQL 2.0的唯一选择。效果很好。我们到处都在做,与我们在应用程序中做的其他事情相比,我们测量的开销可以忽略不计。
- 因为你的
Address
和LineItem
类只包含基本类型,你可以把它们表示成一个Dictionary<K,V>
,转换成CQL 3.0的map
数据类型。同样,如果需要强类型对象,则需要人工干预。-
ListItem
的问题是CQL 3.0list
不能包含另一个集合-在这种情况下是map
。你回到JSON,当然好处是你可以得到尽可能复杂,只要它是可序列化的。
-
我分叉了你的要点,并做了一些粗略的调整,让你知道如何让这个基本的例子工作。https://gist.github.com/dlbromen/5811969