将POCO模型转换为MongoDB的Bson格式

时间:2015-09-21 05:53:19

标签: c# mongodb annotations mongodb-.net-driver bson

以下是有关我的开发环境的信息:

Microsoft Visual Studio Community 2015

.NET Framework 4.6

ASP.NET MVC程序集System.Web.Mvc Version = 5.2.3.0

MongoDB.Driver 2.0.1.27

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

 }

以下是使用Mongo DB连接管理器类的DAO C#类:

   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

我认为错误与以某种方式将UserModel POCO转换为MongoDB的Bson格式有关。因此,在我的UserModel POCO中,我使用了名为MongoDB.Bson.Serialization.Attributes的使用空间,因为我认为我们需要使用MongoDB Annotations。但是,它仍未能解决问题。

有人可以告诉我如何纠正这个问题吗?

1 个答案:

答案 0 :(得分:6)

您应该从模型中删除_id属性,因为它是由mongo生成的,您不需要自己添加它。此外,您可以使用除[BsonId]之外的[BsonElement]属性标记应包含在模型中的所有属性。

此外,您应该序列化和反序列化到您自己的模型而不是BsonDocument:

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

您正在创建自定义类并尝试在不进行任何转换的情况下获取和插入BsonDocument。如果你想直接使用BsonDocument,可以这样调用:

var umToBson = um.ToBsonDocument();

然后按照您的尝试插入它。