C# 用C语言修改Cassandra表的正确方法#

C# 用C语言修改Cassandra表的正确方法#,c#,cassandra,datastax,C#,Cassandra,Datastax,我的问题在下一期 我的代码中有下一个简单的模型: 公共类客户端 { 公共Guid Id{get;set;} 公共字符串名称{get;set;} } 我为它定义了一个映射: 公共类CustomMappings:映射 { 公共自定义映射() { For().TableName(“客户端”) .PartitionKey(x=>x.Id); } } 我通过table.CreateIfNotExist()方法创建了表: var表=新表(会话); table.CreateIfNotExists();

我的问题在下一期

我的代码中有下一个简单的模型:

公共类客户端
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
}
我为它定义了一个映射:

公共类CustomMappings:映射
{
公共自定义映射()
{
For().TableName(“客户端”)
.PartitionKey(x=>x.Id);
}
}
我通过
table.CreateIfNotExist()
方法创建了表:

var表=新表(会话);
table.CreateIfNotExists();
我可以通过下一种方式插入数据:

IMapper映射器=新映射器(会话);
var客户机=新客户机
{
Id=Guid.NewGuid(),
Name=“约翰·史密斯”
};
等待mapper.updateSync(客户端);
在此之后,我通过添加新属性更改了模型:

公共类客户端
{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
}
我需要修改这个表,因为我想在其中添加姓氏列。 当然,当我尝试插入一个值时,我有一个没有它的异常:

Cassandra.InvalidQueryException:未定义的列名姓氏
在Cassandra.Requests.PrepareHandler.Prepare(PrepareRequest请求、IInternalSession会话、Dictionary`2 triedHosts)
在Cassandra.Requests.PrepareHandler.Prepare(IIInternalSession会话、序列化程序序列化程序、PrepareRequest请求)
在Cassandra.Session.PrepareAsync(字符串查询,IDictionary`2 customPayload)
在Cassandra.Mapping.Statements.StatementFactory.GetStatementAsync(ISession会话,Cql Cql,null`1 forceNoPrepare)
在Cassandra.Mapping.Mapper.ExecuteAsync(Cql-Cql)
但是class
Cassandra.Data.Linq.Table
既不包含也不包含
.alterCreate()
.Alter()
方法。另外,我们在
Cassandra.Mapping.Statements.CqlGenerator
中没有
.GetAlter()
方法

哪种方法更适合解决这个问题?我有两个假设(除了在github上创建一个包含datastax csharp驱动程序存储库所需方法的pull请求:)

  • 通过.cql文件中的cql脚本修改表,该脚本将以c#代码执行
  • 在模型每次更改后创建新表并将旧数据迁移到其中

  • 我是Cassandra的新手,我怀疑库中不存在所需的方法,这是有充分理由的。也许,因为Cassandra是分布式数据库,所以更改后是否存在一致性问题?

    对Cassandra模式的更改应该非常准确-您对其分布式性质的认识是正确的,并且在进行更改时需要考虑。通常建议只通过一个节点进行更改,在执行任何DDL语句(创建/删除/更改)后,您需要检查模式是否一致(例如,通过
    元数据
    类),并且在模式一致之前不执行下一条语句

    谈到更改本身——我不确定C#driver是否能够自动生成模式的更改,但您可以按照中所述的CQL命令执行更改(请仔细阅读限制!)。模式中的更改可分为两组:

  • 这可以应用于表,而无需迁移数据
  • 这将需要创建具有所需结构的新表,并迁移数据
  • 在第一组中,我们可以执行以下操作(可能不是完整的列表):

    • 向表中添加新的常规列
    • 从表中删除一个常规列
    • 重命名群集列
    第二组包括其他所有内容:

    • 更改主键-向主键添加列或从主键删除列
    • 非群集列的重命名
    • 更改列的类型(建议使用所需类型创建全新的列,复制数据,然后删除原始列-不建议使用不同类型的相同名称,因为这可能会使数据无法访问)

    数据迁移可以通过不同的工具完成,这可能取决于特定的需求,如类型更改等。但情况不同。

    非常感谢您的详细回复!