gpt4 book ai didi

c# - 无法将类型为 'MongoDB.Bson.Serialization.Serializers.DateTimeSerializer' 的对象转换为类型 'MongoDB.Bson.Serialization.IBsonSerializer`

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:45 30 4
gpt4 key购买 nike

在搜索解决方案时,我得到了 thisthis但我不清楚这个概念,所以无法实现:(。当我尝试更新数据库中的值(特别是日期时间对象)时会发生此错误。以下是我正在使用的代码:-

     var update = Builders<Model>.Update
.Set(t => t.startdate, BsonValue(objModel.startdate));
var result = model.UpdateOne(query, update);

BonValue函数如下:-

   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;
}

我认为这是因为我已经开始使用mongoDB.Bson和mongoDB.Driver的升级包。当前版本为2.3.0

如有任何帮助,我们将不胜感激。

编辑

1) 在插入数据时我所做的如下:-

    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;
}

我在这里也得到了开始日期的值,也得到了 modifiedcount=1,但是当我检查数据库时,它仍然显示开始状态为 null。

我的模型类:-

    public class Model
{
public static string CollectionName
{
get { return "Collection"; }
}

public ObjectId id { get; set; }

[BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
[BsonRepresentation(BsonType.DateTime)]
public DateTime startdate { get; set; }
}

最佳答案

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

尝试在您的模型上设置 BsonRepresentation

public class Model
{
[BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
[BsonRepresentation(BsonType.DateTime)]
public DateTime startDate { get; set; }
}

为了澄清起见,我建议您将集合变量重命名为集合而不是模型,因为这会造成混淆,所以

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

Model objModel = new Model { startDate = DateTime.UtcNow };
collection.InsertOne(yourModel);

要执行更新,您不需要设置 BsonValue

 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);

一个建议是将您的 ObjectId 存储为字符串并像使用 DateTime 一样使用 BsonRepresentation:

[BsonRepresentation(BsonType.ObjectId)]
[BsonId]
public string Id { get; set; }

这样你就不需要特意将它解析为 ObjectId 并且它的工作原理是一样的,所以你的过滤器就变成了

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

或者您可以像这样在更新中直接使用 Lambda:

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

关于c# - 无法将类型为 'MongoDB.Bson.Serialization.Serializers.DateTimeSerializer' 的对象转换为类型 'MongoDB.Bson.Serialization.IBsonSerializer`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40212840/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com