我有一个内部具有枚举属性的类。由于整个文档的.NET表示形式中的属性,因此在保存整个文档时,该属性将作为字符串写入数据库中。
public enum Status { Good, Bad }
public class Document
{
[BsonRepresentation(BsonType.String)]
public Status Status { get; set; }
// ...
}
稍后,当我想在不保存整个文档的情况下更新文档中的值时,我会像这样构造一个过滤器:
var builder = Builders<T>.Update;
var filter = builder.Set(new StringFieldDefinition<T, Status>(fieldName), (Status)value);
var result = await Context.Collection.UpdateManyAsync(filter, update);
不幸的是,这写了枚举的整数值。
如果我将过滤器更改为此
var filter = builder.Set(new StringFieldDefinition<T, Status>(fieldName), value.ToString());
驾驶员将抛出InvalidCastException
。如何正确构造过滤器?还有另一种直接设置枚举值而无需替换文档的方法吗?
我想到可能有一种方法可以将单字段行为与整个文档中的属性相关联,但是我似乎找不到解决方法。
C#枚举由整数表示。默认情况下,第一个枚举为0,第二个枚举为1,依此类推。您可以为枚举条目分配特定的整数值,但它们又被解释为整数,而不是字符串。要获取与您的枚举条目匹配的字符串值,必须使用enum.parse
方法。
目前我没有C#环境,因此我无法测试我的建议,但是请尝试这个...
如何:(未测试)
一旦您用[BsonRepresentation(BsonType.String)]
装饰枚举属性,就无需在代码中进行任何强制转换。该属性指示驱动程序将枚举值的搅拌名称存储在数据库中,反序列化时,将其设置回适当的枚举值。这样您的应用程序代码就可以处理枚举。