Cassandra C#driver mapper

时间:2016-11-14 18:16:35

标签: c# cassandra

Cassandra数据建模的基本规则建议我们为每个查询模式创建表。

  

在实践中,这通常意味着每个人大约使用一个表   查询模式。如果您需要支持多种查询模式,那么您   通常需要不止一张桌子。

例如,我们可以为 Users

创建这3个表
CREATE TABLE IF NOT EXISTS users(
    id uuid,
    username text,
    emial text,
    role text,
    PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS users_by_role(
    role text,
    userid uuid,
    username text,
    emial text,
    PRIMARY KEY (role)
);

CREATE TABLE IF NOT EXISTS users_by_email(
    email text,
    userid uuid,
    username text,
    role text,
    PRIMARY KEY (email)
);

在使用Cassandra CSharp驱动程序的C#中,我们将 User 映射到第一个表:

public class User
{
    public Guid Id;
    public string UserName;
    public string Email;
    public string Role;
}

var config = new MappingConfiguration();
config.Define(new Map<User>()
   .TableName("users")
   .PartitionKey((o) => o.Id)
   .Column((u) => u.Id, (cm) => cm.WithName("id"))
   .Column((u) => u.UserName, (cm) => cm.WithName("username"))
   .Column((u) => u.Email, (cm) => cm.WithName("email"))
   .Column((u) => u.Role, (cm) => cm.WithName("role"))
   .ExplicitColumns());
UserMapper = new Mapper(Session, config);

使用Mapper读取数据:

User result = UserMapper.Single<User>("WHERE id=?", guid);

我的第一个问题是:我们如何将用户映射到其他两个表 users_by_role users_by_email ?我不认为我们必须再创建2个具有相同属性的CLR类型。 (此外,我们可以在其他表中使用不同的列) 第二个问题:我们如何在BatchStatement中使用定义的映射器?例如:要将用户插入第一个表,我们将使用:

UserMapper.Insert<User>(usr);

但在我们的示例中,我们必须批量插入3个表。什么是最好的方法?

驱动程序版本3.1.0.1

1 个答案:

答案 0 :(得分:0)

我想这是无法做到的事情。 您将不得不继续将3映射到每个cassandra模型。

Cassandra Table&lt; =&gt; c#Object。

根据搜索类型(电子邮件,ID或角色)访问它们时,您需要创建一个抽象级别,这将返回用户。