我正在尝试将uint
字段从1递减到0.由于Inc
的工作方式,我必须将它转换为int,因此:
UpdateDefinition<Student> updateDef = Builders<Student>.Update.Inc(s => (int)s.Grade, -1);
GetStudentCollection().UpdateOne(s => s.Id == 12345, updateDef);
当我使用1
而不是-1
进行增量时,这非常正常,但是当我运行此代码时,我收到以下错误:
System.OverflowException: Value was either too large or too small for a UInt32.
at System.Convert.ToUInt32(Int32 value)
我已经从该LINQ查询中调试了检索到的Student
,并在我尝试减少之前确认s.Grade
位于1
。由于0
在有效uint
范围内,我不明白为什么它会出错。
我可以错过什么?如何绕过uint
? (如在“不使用uints”之外的解决方案中)
答案 0 :(得分:0)
Inc
中的 UpdateDefinitionBuilder
定义为:
public UpdateDefinition<TDocument> Inc<TField>(FieldDefinition<TDocument, TField> field, TField value);
相同类型TField
用于字段定义(FieldDefinition<TDocument, TField>
),对于增量值,这就是后续表达式无法编译的原因:
Builders<Student>.Update.Inc(x => x.Grade, -1);
通过将x.Grade
转换为int
,您可以欺骗编译器而不是MongoDB驱动程序。最终,驱动程序会尝试将-1
的值转换为投放uint
的{{1}}的模型类型。
如果你想为OverflowException
属性保留uint
的数据类型并且有可能减少它,我唯一可以理解的方法是绕过强类型Grade
并且使用原始UpdateDefinition
运算符:
$inc