将 POCO 模型转换为 MongoDB 的 Bson 格式
converting the POCO Model into MongoDB's Bson format
我的开发环境信息如下:
微软 Visual Studio 社区 2015
.NET Framework 4.6
ASP.NET MVC 程序集System.Web.Mvc 版本=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 class:
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 数据库连接管理器的 DAO C# class Class:
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 中的以下代码行 class:
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 的 space,因为我认为我们需要使用 MongoDB Annotations。但是还是没能解决问题。
有人可以告诉我如何解决这个问题吗?
您应该从模型中删除 _id 属性,因为它是由 mongo 生成的,您不需要自己添加。您还可以使用 [BsonElement] 属性标记应包含在模型中的所有属性,但 [BsonId] 除外。
另外你应该序列化和反序列化到你自己的模型而不是 BsonDocument :
MongoCollection<UserModel> userDetails = database.GetCollection<UserModel>("Users");
userDetails.InsertOneAsync(um);
您正在创建自定义 class 并尝试在不进行任何转换的情况下获取和插入 BsonDocument。如果你想直接使用 BsonDocument,你可以这样调用:
var umToBson = um.ToBsonDocument();
然后按照您的意愿插入。
我的开发环境信息如下:
微软 Visual Studio 社区 2015
.NET Framework 4.6
ASP.NET MVC 程序集System.Web.Mvc 版本=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 class:
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 数据库连接管理器的 DAO C# class Class:
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 中的以下代码行 class:
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 的 space,因为我认为我们需要使用 MongoDB Annotations。但是还是没能解决问题。
有人可以告诉我如何解决这个问题吗?
您应该从模型中删除 _id 属性,因为它是由 mongo 生成的,您不需要自己添加。您还可以使用 [BsonElement] 属性标记应包含在模型中的所有属性,但 [BsonId] 除外。
另外你应该序列化和反序列化到你自己的模型而不是 BsonDocument :
MongoCollection<UserModel> userDetails = database.GetCollection<UserModel>("Users");
userDetails.InsertOneAsync(um);
您正在创建自定义 class 并尝试在不进行任何转换的情况下获取和插入 BsonDocument。如果你想直接使用 BsonDocument,你可以这样调用:
var umToBson = um.ToBsonDocument();
然后按照您的意愿插入。