3

I'm trying out the DataStax Cassandra .NET driver and I'm attempting to implement something more complex than a bucket of strings (see https://gist.github.com/peschkaj/5794713).

When I attempt to create the table using

var table = session.GetTable<SalesOrder>();
table.CreateIfNotExists();

I get the following exception:

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

The operation fails, in part, because of the DateTime and in part because of the custom types. What is the appropriate syntax/pattern/etc for saving complex objects back to Cassandra using the C# driver?

4

1 回答 1

1

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

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

  1. 将您的对象序列化为 JSON,然后“值”列可以只是您的 JSON 字符串。获取后,您从 JSON 中重新水合您的 .NET 对象。这就是我们在 CQL 2.0 实现中所做的,也是 CQL 2.0 的唯一选择。它运作良好。我们在所有地方都这样做,与我们在应用程序中所做的其他事情相比,我们测量的开销可以忽略不计。
  2. 因为您的AddressLineItem类仅包含原始类型,您可以将它们表示为Dictionary<K,V>转换为 CQL 3.0map数据类型的 a。同样,如果您想要一个强类型对象,则需要手动干预。
    • 这样做的问题ListItem是 CQL 3.0list不能包含另一个集合 - 在本例中为map. 为此,您又回到了 JSON,当然优点是只要它是可序列化的,您就可以根据需要变得复杂。

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

于 2013-06-19T06:20:41.293 回答