2012-07-19 70 views
10

的性質,結構與此相同元素「ID」不匹配,我從收集蒙戈結果的任何字段或

[DataContract] 
public class Father 
{ 
    [BsonId] 
    [DataMember] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

[DataContract] 
public class Child 
{ 
    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public int Name { get; set; } 
} 

當我試試這個:

List<Father> f = result.ToList(); 

它叫Element 'Id' does not match any field or property of class Model.Child

我認爲它只是'Id'作爲別的東西。

我該如何處理?謝謝

+1

你能給導致此異常的代碼的更完整列表?例如,結果是什麼?另外,你能告訴我們數據庫中的文件是什麼樣的(最好是json格式)。 – 2012-07-20 13:21:50

+2

我通過在子類中添加_id來解決此問題,就像我在主類中所做的那樣。 我想,所有的ducument需要一個'id'。如果我沒有定義一個,系統會認爲班裏有'_id'。這使我無法將文件轉移到'List '。 – EasonBlack 2012-08-01 09:17:57

+1

查看序列化選項http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial - 您可以將任何屬性標記爲id,例如它不一定是'_id' – Alex 2012-11-13 11:23:54

回答

-1

你的孩子類應該大概指定它繼承了父親

公共類子:父親{...}

你們的父類也許應該補充已知類型的屬性(WCF)。

[DataContract] 
[KnownType(typeof(Child))] 
public class Father 

如果這是一個MongoCollection您保存/提取到(「父親」),那麼你可能需要註冊一個類映射爲每個孩子期望類型。

if (!BsonClassMap.IsClassMapRegistered(typeof(Child))) 
{ 
    BsonClassMap.RegisterClassMap<Child>(
     cm => { cm.AutoMap(); }); 
} 

正如@alexjamesbrown提到的,你不需要命名你的POCO對象「_id」 id字段。 繼承的想法是繼承。所以使用父親的「id」字段(不管它是什麼名字)就足夠了。目前還不清楚爲什麼你的Father類同時擁有Id和_id屬性。其中一個可能沒有必要。

+0

你不需要使用繼承。我也遇到過這個問題。我不知道它是什麼,但我不認爲它的繼承將解決它。我在其他地方也有類似的工作代碼。 – Daryn 2014-05-28 21:02:52

+0

這讓我更接近:http://stackoverflow.com/questions/13859295/strange-behavior-of-mongodb-linq-provider-for-fields-called-id。我最終將我的字段重命名爲包含pid和mongo投影中不僅僅是id或_id的內容。訣竅 – Daryn 2014-05-28 21:11:21

0

您只需刪除ObjecId屬性上的[DataMember]並將Id綁定到ObjectId _id。

,以便類應該是這樣的:

[DataContract] 
public class Father 
{ 
    [BsonId] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { 
      get { return _id.ToString(); } 
      set { _id = ObjectId.Parse(value); } 
    } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

PS:在你的情況下,孩子ID必須手工生成的,如果你希望它是一個對象ID(蒙戈),你會都做同樣的伎倆 最後,反序列化對象,你應該使用newtonsoft.json參考,做這樣的

Father = JsonConvert.DeserializeObject<Father>(response.Content); 
+0

這實際上不起作用 - ObjectId.Parse(值)總是返回0到_id字段。更好的是把它存儲爲一個字符串恕我直言 – AutomationNation 2016-08-23 23:33:24

0

我面對同樣的problem.Same呃ROR發生在var data = query.ToList();

 var collection = db.GetCollection<Product>("Products"); 

     var query = 
      from e in collection.AsQueryable<Product>() 
      where e.name == "kalem" 
      select e; 

     var data = query.ToList(); 

和我的插入是這樣的:

var collection = db.GetCollection<Product>("Products"); 

    collection.InsertBatch(products); 

我解決如下。

 ObjectId id = new ObjectId(); 
     var collection = db.GetCollection<Product>("Products"); 

     collection.InsertBatch(products); 
     id = pr.Id; 

和我說id產品類,如下 產品類別

class Product 
{ 
    public ObjectId Id { get; set; } 
    public string name { get; set; } 
    public string category { get; set; } 
    public double price { get; set; } 
    public DateTime enterTime { get; set; } 
}