使用Datastax Cassandra .NET Client创建表

时间:2013-06-17 05:06:38

标签: c# cassandra

我正在尝试使用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的相应语法/模式/ etc是什么?

1 个答案:

答案 0 :(得分:1)

查看代码,看起来驱动程序只有timestamp的映射 - &gt; DateTimeOffset类型(请参阅code)。如果您将DateTime个对象更改为DateTimeOffset,则会解决该问题。我对他们忽略了DateTime类型的映射这一事实并不感到激动。

驱动程序无法理解嵌套的复杂类型AddressLineItem,也没有内置的方式(ORM)来执行此操作。我看到两个选择:

  1. 将您的对象序列化为JSON,然后列“value”可以只是您的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,当然,只要它是可序列化的,你可以获得所需的复杂功能。
  3. 我分享了你的要点并做了一些粗略的调整,让你知道如何让这个基本的例子工作。 https://gist.github.com/dlbromen/5811969