Cassandra.Data.Linq.CqlExpressionVisitor.FillUpdateProjection 处没有为成员结果定义映射
No mapping defined for member result at Cassandra.Data.Linq.CqlExpressionVisitor.FillUpdateProjection
我有一个带有 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: No mapping defined for member: result
我必须用新对象映射每个 属性 还是我做错了什么?
是的,您必须为要更新的列提供一个表达式,所以这里有两个有效的示例:
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.IsDeleted
更改为 w.IsDeleted == !result.IsDeleted
。我相信 !result.IsDeleted
可以工作是因为 !
符号,但是如果你尝试只使用 result.IsDeleted
它会失败,因为驱动程序需要一个包含两个 "sides" 的表达式(否则它不会'不知道将其与什么进行比较)。
如果您想更新整个记录而不必指定每一列,那么我建议查看映射器 (https://docs.datastax.com/en/developer/csharp-driver/3.11/features/components/mapper/),因为 Linq2Cql 目前不支持它:
IMapper mapper = new Mapper(session);
mapper.Update(record);
我有一个带有 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: No mapping defined for member: result
我必须用新对象映射每个 属性 还是我做错了什么?
是的,您必须为要更新的列提供一个表达式,所以这里有两个有效的示例:
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.IsDeleted
更改为 w.IsDeleted == !result.IsDeleted
。我相信 !result.IsDeleted
可以工作是因为 !
符号,但是如果你尝试只使用 result.IsDeleted
它会失败,因为驱动程序需要一个包含两个 "sides" 的表达式(否则它不会'不知道将其与什么进行比较)。
如果您想更新整个记录而不必指定每一列,那么我建议查看映射器 (https://docs.datastax.com/en/developer/csharp-driver/3.11/features/components/mapper/),因为 Linq2Cql 目前不支持它:
IMapper mapper = new Mapper(session);
mapper.Update(record);