问题描述
我收到MongoDb.Bson.SerializationException:'元素名称'_t'无效。 我最初在网上阅读了所有看起来类似问题的文章,但是在这些文章中,指定了元素名称,即使尝试使用不同的类对象,我在这里也只能得到“ _t”。
var database = AppConfig.client.GetDatabase("test");
var collection = database.GetCollection<BsonDocument>("testcollection");
var filter = Builders<Student>.Filter.Eq(g => g.Name,"oldName");
var update = Builders<Student>.Update.Set(g => g.Name,"NewName");
var updateResult = await collection.UpdateOneAsync(filter.ToBsonDocument(),update.ToBsonDocument());
此外,对于我在网上看到的有关UpdateOneAsync函数的所有示例,下面的过滤器和更新不必是BSON文档,但是,除非如上所述我执行.ToBSONDocument(),否则我的代码将不会编译。
var updateResult =等待收集。UpdateOneAsync(过滤器,更新);
我的课程很少:
public class Student
{
[BsonElement("Name")]
public string Name { get; set; }
[BsonElement("Age")]
public int Age { get; set; }
}
有人可以帮忙弄清楚上面的问题吗?
更新:如何使用渲染进行更新。设置
var registry = BsonSerializer.SerializerRegistry;
var serializer = registry.GetSerializer<Student>();
var filter = Builders<Student>.Filter.Eq(g=> g.Name,"NewName").Render(serializer,registry);
//我认为更新语法不正确。
var update = Builders<Student>.Update.Set(g => g.Name,"Changed").Render(serializer,registry);
//update is throwing error:cannot convert from Mongodb.bson.bsonvalue to mongodb.Driver.updatedeFinition<MongoDB.Bson.BsonDocument
var updateResult = await collection.UpdateOneAsync(filter,update);
解决方法
像您一样使用ToBsonDocument
是不可能的。最简单的解决方法是使用未键入的构建器:
var filter = Builders<BsonDocument>.Filter.Eq("name","oldName");
如果要使用类型化的生成器,应按以下方式致电Render
:
var registry = BsonSerializer.SerializerRegistry;
var serializer = registry.GetSerializer<Student>();
var filter = Builders<Student>.Filter.Eq(e=>e.Name,"oldName").Render(serializer,registry);