使用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的合适语法/模式等是什么?

使用Datastax Cassandra . net Client创建表

查看代码,似乎驱动程序只有timestamp -> DateTimeOffset类型的映射(参见代码)。如果您将DateTime对象更改为DateTimeOffset,则可以解决该问题。但是,我对他们忽略了DateTime类型的映射这一事实并不感到兴奋。

驱动程序不理解您嵌套的复杂类型AddressLineItem,也没有内置的方法(ORM)让它做到这一点。我看到两个选项:

  1. 序列化你的对象成JSON,然后列"值"可以只是你的JSON字符串。在获取时,您将从JSON中重新生成。net对象。这就是我们在CQL 2.0实现中所做的,也是CQL 2.0的唯一选择。效果很好。我们到处都在做,与我们在应用程序中做的其他事情相比,我们测量的开销可以忽略不计。
  2. 因为你的AddressLineItem类只包含基本类型,你可以把它们表示成一个Dictionary<K,V>,转换成CQL 3.0的map数据类型。同样,如果需要强类型对象,则需要人工干预。
    • ListItem的问题是CQL 3.0 list不能包含另一个集合-在这种情况下是map。你回到JSON,当然好处是你可以得到尽可能复杂,只要它是可序列化的。

我分叉了你的要点,并做了一些粗略的调整,让你知道如何让这个基本的例子工作。https://gist.github.com/dlbromen/5811969