【发布时间】:2019-09-23 20:49:27
【问题描述】:
我的问题在下一个。
我的代码中有下一个简单模型:
public class Client
{
public Guid Id { get; set; }
public string Name { get; set; }
}
我为它定义了一个映射:
public class CustomMappings : Mappings
{
public CustomMappings()
{
For<Client>().TableName("clients")
.PartitionKey(x => x.Id);
}
}
我通过Table<TEntity>.CreateIfNotExist()方法创建了表格:
var table = new Table<Client>(session);
table.CreateIfNotExists();
我可以通过以下方式插入我的数据:
IMapper mapper = new Mapper(session);
var client = new Client
{
Id = Guid.NewGuid(),
Name = "John Smith"
};
await mapper.UpdateAsync(client);
在此之后,我通过添加一个新属性更改了我的模型:
public class Client
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
我需要更改此表,因为我想在其中添加 surname 列。 当然,当我尝试插入一个值时,我有一个例外:
Cassandra.InvalidQueryException: Undefined column name surname
at Cassandra.Requests.PrepareHandler.Prepare(PrepareRequest request, IInternalSession session, Dictionary`2 triedHosts)
at Cassandra.Requests.PrepareHandler.Prepare(IInternalSession session, Serializer serializer, PrepareRequest request)
at Cassandra.Session.PrepareAsync(String query, IDictionary`2 customPayload)
at Cassandra.Mapping.Statements.StatementFactory.GetStatementAsync(ISession session, Cql cql, Nullable`1 forceNoPrepare)
at Cassandra.Mapping.Mapper.ExecuteAsync(Cql cql)
但是Cassandra.Data.Linq.Table<TEntity> 类既不包含.AlterOrCreate() 也不包含.Alter() 方法。另外,我们在Cassandra.Mapping.Statements.CqlGenerator 中没有.GetAlter() 方法。
哪种方式更适合解决这个问题?我有两个假设(除了使用所需的方法创建一个拉取请求以在 github 上对 csharp 驱动程序存储库进行 datastax :))。
- 通过 .cql 文件中的 cql 脚本更改表,该脚本将在 c# 代码中执行。
- 在每次更改模型后创建一个新表并将旧数据迁移到该表。
我是 Cassandra 的新手,我怀疑库中不存在所需的方法是有充分理由的。可能是因为Cassandra是分布式数据库,修改后一致性有问题吗?
【问题讨论】: