C#cassandra复合主键

时间:2016-01-04 13:59:06

标签: c# cassandra datastax

在对Cassandra表进行重新更改后,我在C#中遇到了麻烦。原始主键由2部分组成((person_id),car_id),这不足以识别单行,因此密钥扩展((person_id),car_id,purchase_date)。

为person_id(BIGINT),  car_id(BIGINT),  PURCHASE_DATE(timeuuid)

在此更改后,我遇到了一些java错误

2016-01-04 14:24:42.2935 |错误| MyModule |在工作时出错java.lang.RuntimeException:无法在org.apache.cassandra.db.marshal.CompositeType中获取比较器2(org。 apache.cassandra.db.marshal.ReversedType(org.apache.cassandra.db.marshal.TimeUUIDType),org.apache.cassandra.db.marshal.UTF8Type)。这可能是由于架构和数据读取不匹配

我正在使用datastax 2.7.0.0,而我的查询正在检索一个人的所有记录:

this.storage.GetEntityList<MyEntity>(r => r.PersonId== personid);

public virtual IEnumerable<T> GetEntityList<T>(Expression<Func<T, bool>> predicate)
        {
            return new Table<T>(this.Session)
                .Where(predicate)
                .Execute();
        }


public class MyEntity
{
    [PartitionKey]
    [Column("person_id")]
    public long PersonId{ get; set; }

    [ClusteringKey]
    [Column("car_id")]
    public long CarId{ get; set; }

    [ClusteringKey(1)]
    [Column("purchase_date")]
    public TimeUuid PurchaseDate{ get; set; }

如果我用带有SimpleStatement的cql查询数据库,它就像魅力(ironi),但我不在乎。我想知道为什么我的解决方案失败了。

1 个答案:

答案 0 :(得分:1)

G Cassandra TimeUUIDType的等效C#是System.Guid。请参阅CQL data types to C# types

ClusteringKey属性构造函数可以使用SortOrder参数。你应该试试:

[ClusteringKey(1, SortOrder.Descending)]
[Column("purchase_date")]
public Guid PurchaseDate{ get; set; }