C# 无法强制转换类型为';MongoDB.Bson.Serialization.Serializers.DateTimeSerializer';输入';MongoDB.Bson.Serialization.IBMONSerializer`

C# 无法强制转换类型为';MongoDB.Bson.Serialization.Serializers.DateTimeSerializer';输入';MongoDB.Bson.Serialization.IBMONSerializer`,c#,mongodb,serialization,C#,Mongodb,Serialization,在寻找解决方案的过程中,我得到了一个解决方案,但我不清楚这个概念,因此无法实现它:(。 当我尝试更新数据库中的值(特别是datetime对象)时,会发生此错误。下面是我正在使用的代码:- var update = Builders<Model>.Update .Set(t => t.startdate, BsonValue(objModel.startdate)); var result = model.UpdateOne(query

在寻找解决方案的过程中,我得到了一个解决方案,但我不清楚这个概念,因此无法实现它:(。 当我尝试更新数据库中的值(特别是datetime对象)时,会发生此错误。下面是我正在使用的代码:-

     var update = Builders<Model>.Update
            .Set(t => t.startdate, BsonValue(objModel.startdate));
     var result = model.UpdateOne(query, update);
我想这是因为我已经开始使用升级版的mongoDB.Bson和mongoDB.Driver,目前的版本是2.3.0

任何帮助都将不胜感激

编辑

1) 插入数据时,我的操作如下:-

   private static BsonValue BsonValue(object obj)
    {
        if (obj == null)
            return (BsonValue)obj ?? BsonNull.Value;
        else if (obj.GetType() == typeof(string))
            return new BsonString(obj.ToString());
        else if (obj.GetType() == typeof(DateTime))
            return new BsonDateTime(DateTime.SpecifyKind(DateTime.Parse(obj.ToString()), DateTimeKind.Utc));
        else if (obj.GetType() == typeof(int))
            return new BsonInt32(int.Parse(obj.ToString()));
        else
            return (BsonValue)obj;
    } 
    BsonDocument objBsonDoc = new BsonDocument {
            { "startdate",DataManager.GetBsonValue( objModel.startdate) }
        }; return dbHelper.CreateDocument(Model.CollectionName, objBsonDoc);  
在objBsonDoc中,我可以看到StartDate值,但在CreateDocument命令之后,StartDate不会保存在数据库中

2) 这就是我在更新值时所做的:-

    public static long Edit(Model objModel, string id)
    {
        IMongoCollection<Model> model = dbHelper.GetCollection<Model>(Model.CollectionName);

        var query = Builders<Model>.Filter.Eq(t => t.id, ObjectId.Parse(id));

        var update = Builders<Model>.Update
            .Set(t => t.startdate, objModel.startdate);

        var result = model.UpdateOne(query, update);
        return result.MatchedCount;
    }

你不需要像现在这样执行你自己的转换

尝试在模型上设置BsonRepresentation

public class Model
{
    [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
    [BsonRepresentation(BsonType.DateTime)]
    public DateTime startDate { get; set; }
}
为了澄清,我建议您将集合变量重命名为collection而不是model,因为这会让人困惑,所以

IMongoCollection<Model> collection = dbHelper.GetCollection<Model>(Model.CollectionName);

Model objModel = new Model { startDate = DateTime.UtcNow };
collection.InsertOne(yourModel);
这样,您就不必费劲地将其解析为ObjectId,并且它的工作原理是一样的,因此您的过滤器就变得

var query = Builders<Model>.Filter.Eq(t => t.Id, id);
var query=Builders.Filter.Eq(t=>t.Id,Id);
或者您可以在更新中直接使用Lambda,如下所示:

var update = Builders<Model>.Update
    .Set(t => t.Id == id, objModel.startdate);
var update=Builders.update
.Set(t=>t.Id==Id,objModel.startdate);

我已经按照u所说的那样尝试过了,但我得到的修改计数始终为零。只有在记录被实际修改时,修改后的计数才会返回。如果文档没有更改,它将为零。你在过滤什么,你的“查询”变量中有什么?很可能你没有匹配任何记录。如果我得到修改后的计数为1,记录不会在DB中存储日期值。我有这个精确的代码在本地工作,没有问题。请更新您的问题以包含“查询”变量。如果修改的计数为1,则文档肯定已被修改。如果您说日期字段未更新,请在执行更新之前检查objModel.startdate的值,以确保该值与数据库中已保存的值不同。如果您还希望共享您的“模型”类,请。我不明白您为什么要这样做来填充objBsonDoc。我认为你把事情复杂化了
[BsonRepresentation(BsonType.ObjectId)]
[BsonId]
public string Id { get; set; }
var query = Builders<Model>.Filter.Eq(t => t.Id, id);
var update = Builders<Model>.Update
    .Set(t => t.Id == id, objModel.startdate);