2011-07-21 10 views
9

Używam oficjalnego sterownika mongodb dla C# w moim projekcie testowym i już wstawiłem dokument z aplikacji webowej C# do mongodb. W konsoli mongo db.blog.find() może wyświetlać wpisy, które wstawiłem. ale kiedy próbowałem je odzyskać, .net rzucić wyjątekOdzyskiwanie danych z mongodb za pomocą C# sterownika

"System.InvalidOperationException: ReadString można wywołać tylko wtedy, gdy CurrentBsonType jest String, a nie gdy CurrentBsonType jest ObjectId."

moja klasa jednostka jest bardzo prosta

namespace MongoDBTest 
{ 
    public class Blog 
    { 
     public String _id 
     { 
      get; 
      set; 
     } 

     public String Title 
     { 
      get; 
      set; 
     } 
    } 
} 

a to mój pobrać kod

public List<Blog> List() 
{ 
    MongoCollection collection = md.GetCollection<Blog>("blog"); 
    MongoCursor<Blog> cursor = collection.FindAllAs<Blog>(); 
    cursor.SetLimit(5); 
    return cursor.ToList(); 
} 

Czy ktoś może mi pomóc? dzięki!

Odpowiedz

10

Przypuszczam, wystarczy oznaczyć swój blog Id z BsonId (i wstawić id siebie) atrybut:

public class Blog 
{ 
    [BsonId] 
    public String Id {get;set;} 

    public String Title{get;set;} 
} 

I wszystko powinno być w porządku. Problem polegał na tym, że nie zaznaczyłeś, które pole będzie to Mongodb _id, a sterownik wygenerował pole _id z typem ObjectId. A gdy sterownik próbuje deserializować go z powrotem, nie może przekonwertować ObjectId na ciąg.

Kompletny przykład:

MongoCollection collection = md.GetCollection<Blog>("blog"); 
var blog = new Blog(){Id = ObjectId.GenerateNewId().ToString(), 
         Title = "First Blog"}; 
collection .Insert(blog); 

MongoCursor<Blog> cursor = collection.FindAllAs<Blog>(); 
cursor.SetLimit(5); 

var list = cursor.ToList(); 
+0

Cześć Andrew Orsich, dzięki za odpowiedź ur. –

+0

hi Andrew Orsich, Wstawiłem dokument za pomocą ** BsonDocument ** i mongodb auto generuję ObjectId dla dokumentu i przechowuję go, gdy używam MongoCollection i wywołuję metodę FindAllAs , metoda ReadString zgłasza wyjątek. ** Więc zmienię MongoCollection na MongoCollection i obiekt kursora ruchu w instrukcji foreach, aby przekonwertować każdy dokument na obiekt bloga **. Tak czy inaczej, odpowiedź ur pomogła mi rozwiązać mój problem, dziękuję :) –

+0

Łatwiejszą poprawką byłoby zmienić typ danych identyfikatora na ObjectId i udekorować go [BsonId].Wystąpił ten sam komunikat o błędzie, a zmiana ta naprawiła to za mnie. – CodeMonkey1313

1

Spójrz na moją sample project na github. Później spóźniłem się bardzo na MongoDB. Ta aplikacja pokazuje wiele przydatnych rzeczy, które również mogą Cię zainteresować; wzór repozytorium z MongoDB.

0

Rodzaj i nazwa członka id powinny być różne następująco

public ObjectId Id { get; set; } 

Gdzie ObjectId jest w przestrzeni nazw MongoDB.Bson

2

Odzyskiwanie danych z MongoDB przy użyciu C# jest dość prosty i istnieją trzy różne sposoby, dane mogą być rozwijane na frontend

  1. Lista
  2. Kursor
  3. LINQ

    using (var cursor = await col.Find(new BsonDocument()).ToCursorAsync()) 
    { 
    while (await cursor.MoveNextAsync()) 
    { 
        foreach (var doc in cursor.Current) 
        { 
         Console.WriteLine(doc); 
        } 
        } 
    } 
    

powyższy kod Pokazuje odzyskać dane za pomocą kursorów. Referrence

+0

Używa nowego interfejsu API. Wielkie dzięki. –