2016-04-18 39 views
3

我有以下结构的数据库:MongoDB的反序列化在C#中,当自定义ID字段

{ 
     "_id" : ObjectId(""), 
     "title" : "something", 
     "id" : 1, 
     (...) 
} 

Basicly我想从以下收集到我的类retrive数据:

[BsonIgnoreExtraElements] 
public class Topic 
{ 
    [BsonElement("id")] 
    public int Id { get; set; } 
    [BsonElement("title")] 
    public string Name { get; set; } 
} 

问题此代码不起作用 - >执行错误消息: 无法从BsonType'ObjectId'反序列化'Int32', 但是这样做:

[BsonIgnoreExtraElements] 
public class Topic 
{ 
    [BsonIgnore] 
    public int Id { get; set; } 
    [BsonElement("title")] 
    public string Name { get; set; } 
    [BsonElement("id")] 
    public int IdTest { get; set; } 

看起来像反序列化desperatly试图匹配类属性与名称“ID”与数据库中的ObjectId,这是不正确的,因为我明确声明,我想与BsonElement(“ID”)匹配而不是(“ _ID”)。

我很欣赏任何想法如何使它能够正常工作。

回答

0

我落得这样做:

public class Topic 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[BsonIgnoreExtraElements] 
public class TopicMapper 
{ 
    [BsonElement("title")] 
    public string Name { get; set; } 
    [BsonElement("id")] 
    public int Identity { get; set; } 
} 

这:

var list = await col.Find(new BsonDocument()).ToListAsync().ConfigureAwait(false); 
     foreach(var doc in list) 
     { 
      if(doc.Name != null) 
       topics.Add(new Topic{ 
       Id = doc.Identity, 
       Name = doc.Name 
       }); 
     } 
1

你“_id”存储在您的蒙戈文档中的类型BsonType.ObjectId如此反序列化时,序列化尝试找到名称为“Id”的属性并使用ObjectId类型。在你的情况下,它发现了一致的姓名,但不正确的类型,是INT(INT32型类):我的建议是要改变

public int Id { get; set; } 

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

或者

public ObjectId Id { get; set; } 

或者如果您使用MongoRepository,使您的类继承自类实体:

 [BsonIgnoreExtraElements] 
    public class Topic : Entity 
    { 
     [BsonElement("title")] 
     public string Name { get; set; } 
    } 
相关问题