我正在尝试使用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是什么?
答案 0 :(得分:1)
查看代码,看起来驱动程序只有timestamp
的映射 - &gt; DateTimeOffset
类型(请参阅code)。如果您将DateTime
个对象更改为DateTimeOffset
,则会解决该问题。我对他们忽略了DateTime
类型的映射这一事实并不感到激动。
驱动程序无法理解嵌套的复杂类型Address
或LineItem
,也没有内置的方式(ORM)来执行此操作。我看到两个选择:
Address
和LineItem
类仅包含基本类型,因此您可以将它们表示为Dictionary<K,V>
,转换为CQL 3.0 map
数据类型。同样,如果您需要强类型对象,则需要手动干预。
ListItem
的问题在于CQL 3.0 list
不能包含其他集合 - 在本例中为map
。你回到了JSON,当然,只要它是可序列化的,你可以获得所需的复杂功能。我分享了你的要点并做了一些粗略的调整,让你知道如何让这个基本的例子工作。 https://gist.github.com/dlbromen/5811969