Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改MongoDB中文档中存储为字符串的枚举值_C#_Mongodb_Enums_Mongodb .net Driver - Fatal编程技术网

C# 更改MongoDB中文档中存储为字符串的枚举值

C# 更改MongoDB中文档中存储为字符串的枚举值,c#,mongodb,enums,mongodb-.net-driver,C#,Mongodb,Enums,Mongodb .net Driver,我有一个类,里面有一个枚举属性。由于下面文档的.NET表示形式中的属性,因此在保存整个文档时,该属性将作为字符串写入数据库 public enum Status { Good, Bad } public class Document { [BsonRepresentation(BsonType.String)] public Status Status { get; set; } // ... } 稍后,当我想在不保存整个文档的情况下更新文档中的值时,我会构建如下过

我有一个类,里面有一个枚举属性。由于下面文档的.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 builder=Builders.Update;
var filter=builder.Set(新的StringFieldDefinition(fieldName),(Status)值);
var result=await Context.Collection.UpdateManyAsync(filter,update);
很遗憾,这会写入枚举的整数值

如果我把过滤器换成这个

var filter = builder.Set(new StringFieldDefinition<T, Status>(fieldName), value.ToString());
var filter=builder.Set(新的StringFieldDefinition(fieldName),value.ToString());
驱动程序将抛出一个
InvalidCastException
。如何正确构造过滤器?是否有其他方法可以直接设置枚举值而不替换文档

我突然想到,可能有一种方法可以将单个字段行为与整个文档上的属性联系起来,但我似乎不知道如何做到这一点。

这个怎么样:(未测试)

await collection.UpdateManyAsync(
Builders.Filter.Eq(fieldName,(Status)value)),//过滤器定义
Builders.Update.Set(fieldName,(Status)value));
C#枚举由整数表示。默认情况下,第一个枚举为0,第二个枚举为1,依此类推。您可以为枚举项指定特定的整数值,但它们同样被解释为整数,而不是字符串。要获取与枚举项匹配的字符串值,必须使用
enum.parse
方法

我目前没有可用的C#环境,因此我无法测试我的建议,但请尝试此

var filter = builder.Set(new StringFieldDefinition<T, String>(fieldName), Enum.Parse(typeof(Status), value));
var filter=builder.Set(新的StringFieldDefinition(fieldName)、Enum.Parse(typeof(Status)、value));

一旦使用
[BsonRepresentation(BsonType.String)]装饰枚举属性
就不需要在代码中执行任何强制转换。该属性指示驱动程序将枚举值的stirng名称存储在数据库中,并在对其进行反序列化时将其设置回相应的枚举值。因此,您的应用程序代码只能处理枚举

var statusValue=Status.Good;
var filter=Builders.filter.Eq(d=>d.Status,Status.Bad);
var update=Builders.update.Set(d=>d.Status,statusValue);
collection.UpdateMany(过滤器,更新);
测试程序:

使用MongoDB.Bson;
使用MongoDB.Bson.Serialization.Attributes;
使用MongoDB.Entities;
使用MongoDB.Entities.Core;
命名空间堆栈溢出
{
公共枚举状态{Good,Bad}
公共类文档:实体
{
[BsonRepresentation(BsonType.String)]
公共状态状态{get;set;}
}
公共静态类程序
{
私有静态void Main()
{
新DB(“测试”);
新文档{Status=Status.Bad}.Save();
var statusValue=状态。良好;
DB.Update()
.Match(f=>f.Eq(d=>d.Status,Status.Bad))
.Modify(b=>b.Set(d=>d.Status,statusValue))
.Execute();
}
}
}
var filter = builder.Set(new StringFieldDefinition<T, String>(fieldName), Enum.Parse(typeof(Status), value));