2015-09-21 1 views
2

Voici les informations sur mon environnement de développement:conversion du POCO modèle en format BSON de MongoDB

Microsoft Visual Studio 2015 Communauté

.NET Framework 4.6

assemblage ASP.NET MVC System.Web. Mvc version = 5.2.3.0

MongoDB.Driver 2.0.1.27

MongoDB 3.0.6

Dans mon application C#, j'ai le code suivant qui récupère une référence de base de données MongoDB:

public class MongoDBConnectionManager 
{ 

    public IMongoDatabase getMongoDB() { 

      var client = new MongoClient("mongodb://localhost:27017"); 
      IMongoDatabase iMgDb = client.GetDatabase("foo"); 
      IMongoCollection<BsonDocument> UserDetails = 
      iMgDb.GetCollection<BsonDocument>("Users"); 
      return iMgDb; 
    } // end of public IMongoDatabase getMongoDB() 

    } // end of public class MongoDBConnectionManager 

Voici la classe POCO qui représentent un utilisateur d'une entité commerciale:

using MongoDB.Bson.Serialization.Attributes; 

public class UserModel 
{ 

    public object _id { get; set; } //MongoDb uses this field as identity. 

    [BsonId] 
    public int ID { get; set; } 

    [Required] 
    [BsonRepresentation(MongoDB.Bson.BsonType.String)] 
    public string UserName { get; set; } 

    [Required] 
    //[DataType(DataType.Password)] 
    [BsonRepresentation(MongoDB.Bson.BsonType.String)] 
    public string Password { get; set; } 

    [Required] 
    // [DataType(DataType.EmailAddress)] 
    [BsonRepresentation(MongoDB.Bson.BsonType.String)] 
    public string Email { get; set; } 


    [BsonRepresentation(MongoDB.Bson.BsonType.String)] 
    public string PhoneNo { get; set; } 

    [BsonRepresentation(MongoDB.Bson.BsonType.String)] 
    public string Address { get; set; } 

} 

Voici le DAO C# classe qui utilise la classe DB Mongo Connection Manager:

public class DAO 
    { 

     public int insertNewUser(UserModel um) 
     { 
     MongoDBConnectionManager mgoDBCntMng = new MongoDBConnectionManager(); 
     IMongoDatabase database = mgoDBCntMng.getMongoDB(); 
     IMongoCollection <BsonDocument> UserDetails = database.GetCollection<BsonDocument>("Users"); 
     UserDetails.InsertOneAsync(um); 

     return 0; 
     } 
    } 

le problème que je suis face est avec le Follo ligne aile du code dans la classe DAO:

UserDetails.InsertOneAsync(um); 

Communauté Visual Studio 2015 affiche l'erreur suivante:

cannot convert from 'UserModel' to MongoDB.Bson.BsonDocument 

Je crois que l'erreur a quelque chose à voir avec la traduction en quelque sorte le userModel POCO dans le format BSON de MongoDB . Par conséquent, dans mon POCO UserModel, j'ai utilisé l'espace d'utilisation appelé MongoDB.Bson.Serialization.Attributes parce que je pensais que nous avions besoin d'utiliser MongoDB Annotations. Cependant, il n'a toujours pas réussi à résoudre le problème.

Quelqu'un pourrait me dire comment corriger le problème?

Répondre

5

Vous devez supprimer la propriété _id de votre modèle car elle est générée par mongo et vous n'avez pas besoin de l'ajouter vous-même. Vous pouvez également marquer toutes les propriétés qui doivent être incluses dans le modèle avec l'attribut [BsonElement] à l'exception de [BsonId].

Aussi, vous devriez sérialisation et la désérialisation à votre propre modèle non BsonDocument:

MongoCollection<UserModel> userDetails = database.GetCollection<UserModel>("Users"); 
userDetails.InsertOneAsync(um); 

Vous créez votre classe personnalisée et d'essayer de chercher et insérer BsonDocument sans aucune conversion. Si vous voulez travailler directement avec BsonDocument vous pouvez appeler quelque chose comme ceci:

var umToBson = um.ToBsonDocument(); 

puis insérez-le comme vous essayez de.

+1

Vous n'avez pas besoin de tout marquer avec BsonElement. Le conducteur ramassera toute propriété publique par lui-même. Vous n'avez pas non plus besoin de nous dire qu'une propriété de chaîne doit être représentée comme une chaîne. Je suggère de supprimer tous les attributs et de ne remettre que ceux dont vous avez besoin. Supprimez ce _id cependant. La propriété "ID" est marquée avec BsonId, indiquant qu'il doit être utilisé comme identifiant. –

+0

Thx dlght & @ craig-wilson, pourriez-vous me dire comment je peux spécifier public int ID {get; ensemble; } pour auto-incrémenter depuis le POCO appelé UserModel? – user1338998

+2

MongoDB ne prend pas en charge les champs auto-incrémentés.Vous devrez soit le créer vous-même, soit utiliser un ObjectId. –