преобразование модели POCO в формат MongoDB Bson

Вот информация о моей среде разработки:

Сообщество Microsoft Visual Studio 2015

.NET Framework 4.6

Сборка ASP.NET MVC System.Web.Mvc Version=5.2.3.0

MongoDB.Драйвер 2.0.1.27

Монгодб 3.0.6

В моем приложении C# у меня есть следующий код, который извлекает ссылку на базу данных 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

Вот класс POCO, представляющий бизнес-объект пользователя:

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

 }

Вот класс DAO C#, который использует класс диспетчера соединений Mongo DB:

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

Проблема, с которой я столкнулся, связана со следующей строкой кода в классе DAO:

  UserDetails.InsertOneAsync(um);

Visual Studio Community 2015 отображает следующую ошибку:

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

Я считаю, что ошибка как-то связана с переводом POCO UserModel в формат MongoDB Bson. Поэтому в моем POCO UserModel я использовал пространство использования под названием MongoDB.Bson.Serialization.Attributes, потому что я думал, что нам нужно использовать аннотации MongoDB. Однако решить проблему так и не удалось.

Может кто-нибудь, пожалуйста, скажите мне, как исправить проблему?


person user1338998    schedule 21.09.2015    source источник


Ответы (1)


Вы должны удалить свойство _id из своей модели, поскольку оно генерируется монго, и вам не нужно добавлять его самостоятельно. Также вы можете пометить все свои свойства, которые должны быть включены в модель, атрибутом [BsonElement], кроме [BsonId].

Также вы должны сериализовать и десериализовать свою собственную модель, а не BsonDocument :

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

Вы создаете свой собственный класс и пытаетесь извлечь и вставить BsonDocument без какого-либо преобразования. Если вы хотите работать напрямую с BsonDocument, вы можете вызвать что-то вроде этого:

var umToBson = um.ToBsonDocument();

а затем вставьте его, как вы пытаетесь.

person dlght    schedule 21.09.2015
comment
Вам не нужно помечать все с помощью BsonElement. Любое общественное имущество водитель заберет сам. Вам также не нужно говорить нам, что строковое свойство должно быть представлено в виде строки. Я бы предложил удалить все атрибуты и вернуть только те, которые вам в конечном итоге понадобятся. Однако удалите этот _id. Свойство ID помечено BsonId, что указывает на то, что его следует использовать в качестве идентификатора. - person Craig Wilson; 21.09.2015
comment
Спасибо, dlght и @craig-wilson, не могли бы вы рассказать мне, как я могу указать открытый идентификатор int { get; набор; } для автоматического увеличения из POCO с именем UserModel? - person user1338998; 22.09.2015
comment
MongoDB не поддерживает автоматически увеличивающиеся поля. Вам придется либо создать это самостоятельно, либо использовать ObjectId. - person Craig Wilson; 22.09.2015
comment
можем ли мы перестать отмечать все элементы один за другим и оставить это в руках mongo db? - person deadManN; 16.04.2017