2014-11-19 6 views
5

Stworzyłem klasę C# tak:System.FormatException”wystąpił w MongoDB.Bson.dll - XXX nie jest ważny 24 cyfr hex ciąg

public class Employee 
    { 
     [BsonRepresentation(BsonType.ObjectId)] 
     public string Name { get; set; } 
     public int Age { get; set; } 
     public List<string> Address { get; set; } 
    } 

Gdy próbuję zapisać te informacje (przy użyciu MongoDB) tak:

var e = new Employee(); 
    e.Address = new List<string>(); 
    e.Address.Add("Address 1"); 
    e.Address.Add("Address 2"); 

    e.Age = 333; 
    e.Name = "Some Name"; 

    context.Employees.Insert(e); 

otrzymuję następujący błąd:

An unhandled exception of type 'System.FormatException' occurred in MongoDB.Bson.dll 

Additional information: 'Some Name' is not a valid 24 digit hex string. 

Jak utworzyć pole ciągów do działania w trybie MongoDB jako ObjectID?

Odpowiedz

3

Odczyt z docs:

... In this case the serializer will convert the ObjectId to a string when reading data from the database and will convert the string back to an ObjectId when writing data to the database (the string value must be a valid ObjectId) ....

proszę usunąć spacje z łańcucha. Niż wszystko powinno działać!

Do dowodu pogoda masz ważny objectID przeczytać następujące SO-Post: MongoDB Node check if objectid is valid

EDIT: ostateczna odpowiedź brzmiała: You have to change [BsonRepresentation(BsonType.ObjectId)] to [BsonId]

+0

Dziękuję za szybką odpowiedź. Usunąłem białą przestrzeń i zmieniłem kod na 'e.Name =" SomeName ";', ale wciąż dostaję ten sam błąd. – SharpCoder

+1

@SharpCoder Co habbens po zmianie '[BsonRepresentation (BsonType.ObjectId)]' na '[BsonId]'? – BendEg

+0

Tak. To pomaga !!! dodanie atrybutu [BsonId] 'zamiast' [BsonRepresentation (BsonType.ObjectId)] 'over' właściwość userId' rozwiązało problem. Czy możesz zaktualizować swoją odpowiedź, to pomoże innym użytkownikom w przyszłości !! Dzięki !! – SharpCoder

1

prawidłowy typ ObjectId ciąg ma 12bytes HEX jak '546c776b3e23f5f2ebdd3b03'.

Umieszczasz [BsonRepresentation(BsonType.ObjectId)] dla swojej nieruchomości Name. oznacza to, że sterownik C# konwertuje ciąg do ObjectId i odwrotnie, automatycznie przed każdą operacją serializacji.

Usuń [BsonRepresentation(BsonType.ObjectId)] i

jeśli zarejestrować BsonSerializer.RegisterIdGenerator(typeof(string), new StringObjectIdGenerator()) w swojej aplikacji uruchomić, a jeśli mają właściwość o nazwie Id dla podmiotu, Mongo umieścić ciąg zamiast objectID dla pól ID, i można użyć dowolnego ciągu znaków jako klucz dla pól Id.