没有为cassandra.data.linq.cqlexpressionvisitor.fillupdateproject中的成员结果定义Map

uqdfh47h  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(308)

我有一个基本的应用程序与Cassandra数据存储,我得到异常时,我试图更新实体。
这是实体模型。

public class Log
{
    [ClusteringKey]
    public DateTime CreationDate { get; set; }
    public Guid CreatedById { get; set; }
    public DateTime? LastModifiedDate { get; set; }
    public Guid ModifiedById { get; set; }

    [Cassandra.Mapping.Attributes.PartitionKey]
    public Guid Id { get; set; } = Guid.NewGuid();
    [Cassandra.Mapping.Attributes.PartitionKey]
    public bool IsDeleted { get; set; }

    public int LoggingLevel { get; set; }
    public Guid UserId { get; set; }
    public string TimeZone { get; set; }
    public string Text { get; set; }
    public string Url { get; set; }
    [Frozen]
    public IEnumerable<LogParamsCUDT> LogParams { get; set; }
}

如何尝试更新实体

var table = new Table<Log>(session);
var result = table.First().Execute();

以下代码适用:

table.Where(w=>w.Id==result.Id && !result.IsDeleted && w.CreationDate==result.CreationDate)
.Select(s => new Log {Url="testing update" }).Update().Execute();

下面给出的代码引发错误:

table.Where(w=>w.Id==result.Id && !result.IsDeleted && w.CreationDate==result.CreationDate)
.Select(s => result).Update().Execute();

invalidoperationexception:未为成员定义Map:结果
我是否必须用新对象Map每个属性,还是我做错了什么?

d5vmydt9

d5vmydt91#

是的,您必须为要更新的列提供一个带有赋值的表达式,因此以下是两个有效的示例:

table.Where(w=>w.Id==result.Id && !result.IsDeleted && w.CreationDate==result.CreationDate)
.Select(s => new Log {Url="testing update" }).Update().Execute();

table.Where(w=>w.Id==result.Id && !result.IsDeleted && w.CreationDate==result.CreationDate)
.Select(s => new {Url="testing update" }).Update().Execute();

我建议使用第一种方法,因为如果输入错误的属性名,代码甚至无法编译。
这两个例子产生了以下准备好的陈述:

UPDATE <KEYSPACE>.<TABLE> SET Url = ? WHERE Id = ? AND IsDeleted = ? AND CreationDate = ?

你也可能想要改变 !result.IsDeletedw.IsDeleted == !result.IsDeleted . 我相信 !result.IsDeleted 工作是因为 ! 但是如果你想用 result.IsDeleted 它将失败,因为驱动程序需要一个带有两个“边”的表达式(否则它将不知道将它与什么进行比较)。
如果您想更新整个记录而不必指定每一列,那么我建议您查看Map器(https://docs.datastax.com/en/developer/csharp-driver/3.11/features/components/mapper/),因为linq2cql当前不支持:

IMapper mapper = new Mapper(session);
mapper.Update(record);

相关问题