.net MartenDB:字段成员表达式中不支持运算符“Coalesce”(参数“node”)

hivapdat  于 2023-02-06  发布在  .NET
关注(0)|答案(1)|浏览(128)

. NET七语言
将Marten从4升级到5.11后,此代码导致异常:

storeOptions.Schema.For<UserSession>()
    .Identity(x => x.Key)
    .Duplicate(x => x.SessionId ?? "");

异常开始于:

ERROR: System.ArgumentOutOfRangeException: Unsupported operator 'Coalesce' in a field member expression (Parameter 'node')
   at Marten.Linq.Parsing.FindMembers.VisitBinary(BinaryExpression node)
   at System.Linq.Expressions.ExpressionVisitor.
VisitLambda[T](Expression`1 node)
   at Marten.Schema.DocumentMapping`1.Duplicate(Expression`1 expression, String pgType, Nullable`1 dbType, Action`1 configure, Boolean notNull)
   at Marten.MartenRegistry.DocumentMappingExpression`1.<>c__Displ
ayClass6_0.<Duplicate>b__0(DocumentMapping`1 mapping)
   at Marten.DocumentMappingBuilder`1.Build(StoreOptions options)
   at Marten.Storage.StorageFeatures.Build(Type type, StoreOptions options)
...

如果我把这句冒犯的话改一下:

.Duplicate(x => x.SessionId);

然后我得到一个关于nullable的错误(因为public string? SessionId { get; set; }
如果我写的话它是固定的

.Duplicate(x => x.SessionId!);

MartenDb方法签名如下所示:

public MartenRegistry.DocumentMappingExpression<T> Duplicate(
    Expression<Func<T, object>> expression,
    ...)

第一个问题:我认为nullable不适用于这种情况(从错误消息中),对吗?
第二个问题:关于成员字段表达式和可空性的C#规则是什么?我们能不能构造一个不知道可空性的成员字段表达式?

zc0qhyus

zc0qhyus1#

在上面的表达式中,唯一重要的事情是识别文档类型上的成员,这些成员将被秘密地转换为Postgresql JSONB定位器。可空性无关紧要,并且合并运算符的用法在这里不适用。除了匹配成员的JSONB定位器(或者如果是深层定位器,则为成员路径)之外,没有其他神奇之处。
因此,唯一有效的用法是.Duplicate(x => x.SessionId!);
老实说,我不确定字符串是否可以为空。在索引创建代码构建的时候,这还不存在。

相关问题