我试图在我的Poco对象中使用Guid数据类型作为Id"参数"。但是,虽然我能够将文件写入数据库,但我无法从中读取。
这是将csv文件中的表头写入数据库的导入函数。 csv文件的第一行是参数,第二行是测量参数的单位。所有其他行包含实际值,并作为BsonDocument存储在另一个集合中。 csv文件是动态的,需要通过组合框选择,这就是参数写在自己的集合中的原因。
IMongoCollection<Parameter> parameterCollection = this.MongoDatabase.GetCollection<Parameter>("Parameters");
columnNames.Select((columnName, index) => new Parameter() { Name = columnName, Unit = columnUnits[index] })
.ToList()
.ForEach(parameter =>
{
parameterCollection.UpdateOne(Builders<Parameter>.Filter.Eq("Name", parameter.Name),
Builders<Parameter>.Update.Set("Unit", parameter.Unit),
new UpdateOptions()
{
IsUpsert = true
});
});
这是参数类:
public class Parameter
{
[BsonId]
public Guid Id { get; set; }
public string Name { get; set; }
public string Unit { get; set; }
}
以下是尝试从文档中读取数据的方法:
public List<Parameter> GetParameters()
{
return this.MongoDatabase.GetCollection<Parameter>("Parameters")
.Find(Builders<Parameter>.Filter.Empty)
.ToList();
}
这会导致以下错误消息:
&#34; SystemFormatException:&#39;反序列化类TimeSeriesInterface.DTO.Parameter的Id属性时发生错误:无法反序列化&#39; Guid&#39;来自BsonType&#39; ObjectId&#39;。&#39;
我也尝试了这个属性:[BsonId(IdGenerator = typeof(GuidGenerator))]
除了这两个属性之外,我找不到任何帮助。他们似乎为其他所有人解决了这个问题,但我仍然遇到这个错误。
我可以补充一点,导入和读取函数是不同类的一部分,每个类都调用自己的new MongoClient().GetDatabase(MongoDatabaseRepository.DatabaseName);
但是当我使用ObjectId作为数据类型时,我确实得到了数据,所以我不认为&#39这个问题。
为什么不使用ObjectId作为数据类型?我们有一个额外的数据库访问项目,我不希望在整个地方添加mongodb程序集只是因为其他项目使用POCO并需要引用那个讨厌的小ObjectId。
修改
这是在AlexeyBogdan建议之后在构造函数中使用的映射(事先它只是对AutoMap()的调用):
public MongoDatabaseRepository(string connectionString)
{
this.MongoDbClient = new MongoClient();
this.MongoDatabase = this.MongoDbClient.GetDatabase(MongoDatabaseRepository.DatabaseName);
BsonClassMap.RegisterClassMap<Parameter>(parameterMap =>
{
parameterMap.AutoMap();
parameterMap.MapIdMember(parameter => parameter.Id);
});
}
答案 0 :(得分:0)
我建议您使用此映射
而不是[BsonId]
BsonClassMap.RegisterClassMap<Type>(cm =>
{
cm.AutoMap();
cm.MapIdMember(c => c.Id);
});
我希望它对你有所帮助。