2012-07-19 9 views
10

mam wynik z kolekcji w Mongo, struktura jest taka sama jak taElement „Id” nie pasuje do żadnego pola lub właściwości klasy

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

Kiedy próbuję to:

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

To dzwoni Element 'Id' does not match any field or property of class Model.Child

Myślę, że to po prostu "Id" jako coś innego.

Jak sobie z tym poradzić? Dziękuję

+1

możesz dać pełniejszą listę kodu, który jest przyczyną tego wyjątku? Na przykład, jakie są wyniki? Czy możesz pokazać nam, jak wyglądają dokumenty w bazie danych (najlepiej w formacie json). –

+2

Rozwiązałem ten problem dodając _id w podklasie, tak jak to zrobiłem w głównej klasie. Domyślam się, że cały dukument potrzebuje "id". Jeśli nie zdefiniuję jednego, system pomyśli, że w klasie jest "_id". To sprawia, że ​​nie mogę przenieść dokumentu do 'Listy '. – EasonBlack

+1

Zapoznaj się z opcjami serializacji http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial - możesz oznaczyć dowolną właściwość jako identyfikator, nie musi to być na przykład "_id" – Alex

Odpowiedz

-1

Twoja klasa Dziecko prawdopodobnie powinien określić dziedziczy Ojcu

public class dziecko: ks {...}

Twoja klasa Ojciec powinien chyba dodawać znany atrybut type (dla WCF).

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

Jeśli jest to MongoCollection („ojców”), aby zapisać/pobrać za pośrednictwem, to może trzeba zarejestrować mapy klasy dla każdego typu oczekiwanego dziecka.

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

Jak @alexjamesbrown wspomniano, nie jest wymagane, aby wymienić polu Identyfikator na poco obiektu „_id”. Idea dziedziczenia polega na dziedziczeniu. Używanie pola "id" Ojca (cokolwiek to się nazywa) powinno wystarczyć. Nie jest jasne, dlaczego twoja klasa Ojca ma zarówno cechy Id, jak i własności. Jedna z nich prawdopodobnie nie jest konieczna.

+0

Nie musisz używać dziedziczenia. Natknąłem się również na ten problem. Nie wiem jeszcze, co to jest, ale nie sądzę, że rozwiąże to dziedziczenie. Podobny, działający kod, gdzie indziej. – Daryn

+0

To zbliżyło mnie: http://stackoverflow.com/questions/13859295/strange-behavior-of-mongodb-linq-provider-for-fields-called-id. W końcu zmieniłem nazwę mojego pola na coś więcej niż tylko id lub _id, zarówno w projekcji pocp i mongo. To się udało – Daryn

0

wszystko, co musisz zrobić, to usunąć [DataMember] na atrybut ObjecId i powiązać Id z ObjectID _id.

więc klasa powinna wyglądać następująco:

[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: w przypadku id dziecko musi być generowany ręcznie, jeśli ma to być objectID (Mongo), będziesz nie zrobić tego samego triku wreszcie rozszeregować obiektu, należy użyć odniesienie newtonsoft.json i podoba mi się to

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

To w rzeczywistości nie działa - ObjectId.Parse (value) zawsze zwraca 0 do pola _id. Lepiej po prostu przechowywać to jako ciąg IMHO – AutomationNation

0

wychodził do samego problem.Same er ror wystąpił w 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(); 

i moja wkładka była ta:

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

    collection.InsertBatch(products); 

Rozwiązałem jak poniżej.

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

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

i dodałem id do klasy produktów, jak poniżej klasy produktów

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