Документация драйвера Cassandra .NET невероятно плохая, я пытаюсь собрать что-то функциональное, но я трачу столько времени, пытаясь изменить код из найденных мной документов Java.
Я пытаюсь записать данныена простую таблицу с помощью драйвера Cassandra.Таблица уже существует, и внутри есть дата.Я создал отображение и добавил несколько столбцов.Вот урезанная версия для демонстрации:
For<Profile>().TableName("profiles")
.PartitionKey(p => p.IntegerId)
.Column(p => p.IntegerId, cm => cm.WithName("profileid"))
.Column(p => p.BirthDate, cm => cm.WithName("dateofbirth"))
Есть еще столбцы и таблицы, но это важная часть.
Затем сохранение выполняется с помощью простого универсального метода:
public async Task<bool> Add<T>(T item) where T : EntityBase, new()
{
await _mapper.InsertIfNotExistsAsync(item);
}
Снова там больше кода, но соответствующие части здесь.Важно то, что я использую InsertIfNotExists и использую универсальный метод, который работает с базовой сущностью.
dateofbirth
столбец в Cassandra имеет тип Date.Когда я запускаю метод Insert, я получаю исключение, что длина Date должна составлять 4 байта вместо 8 (я предполагаю, что мне нужно отрезать часть времени DateTime).
Я пытался использовать WithType для отображенияи создание TypeSerializer, подобного тому, что было описано на этом вопросе , но безуспешно.У кого-нибудь есть рабочий код, который сохраняет этот тип (и, возможно, другие типы) в Cassandra?
Вот код для кодека даты, который был адаптирован из Интернета, и как он использовался, он может быть (очень)неправильно:
public class DateCodec : TypeSerializer<DateTime>
{
private static TypeSerializer<LocalDate> _innerSerializer;
public DateCodec(TypeSerializer<LocalDate> serializer)
{
_innerSerializer = serializer;
TypeInfo = new CustomColumnInfo("LocalDate");
}
public override IColumnInfo TypeInfo { get; }
public override DateTime Deserialize(ushort protocolVersion, byte[] buffer, int offset, int length, IColumnInfo typeInfo)
{
var result = _innerSerializer.Deserialize(protocolVersion, buffer, offset, length, typeInfo);
return new DateTime(result.Year, result.Month, result.Day);
}
public override ColumnTypeCode CqlType { get; }
public override byte[] Serialize(ushort protocolVersion, DateTime value)
{
return _innerSerializer.Serialize(protocolVersion, new LocalDate(value.Year, value.Month, value.Day));
}
}
Использование:
TypeSerializerDefinitions definitions = new TypeSerializerDefinitions();
definitions.Define(new DateCodec(TypeSerializer.PrimitiveLocalDateSerializer));
var cluster = Cluster.Builder()
.AddContactPoints(...)
.WithCredentials(...)
.WithTypeSerializers(definitions)
.Build();