在MongoDb中使用Guid作为ID#C

时间:2018-01-23 16:43:03

标签: c# mongodb guid

我试图在我的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);
    });
}

1 个答案:

答案 0 :(得分:0)

我建议您使用此映射

而不是[BsonId]
BsonClassMap.RegisterClassMap<Type>(cm =>
  {
   cm.AutoMap();
   cm.MapIdMember(c => c.Id);
  });

我希望它对你有所帮助。