我正在编写一个通用方法,就像数据访问层一样,使用C#.Net将文档插入MongoDB。我的方法如下所示。这里的集合是从MongoDB中检索到的MongoCollection。
public async T Create(T entity){
await Collection.InsertOneAsync(entity);
}
我想返回插入的实体或MongoDB自动生成的ID。 InsertOneAsync方法返回一个任务。我试着改变它如下。但它的返回类型是无效的。
Collection.InsertOneAsync(entity).GetAwaiter().GetResult();
有没有办法使用InsertOneAsync方法返回id或实体。我在C#中使用MongoDB驱动程序。
答案 0 :(得分:1)
一个好的解决方案是让客户为您生成_id
。
public class MyEntity
{
[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public ObjectId Id { get; set; }
public string SomeStringProperty { get; set; }
public DateTime SomeDateTimeProperty { get; set; }
}
只要在数据库中插入了具有空_id
的实体,就会生成_id
,并且在插入之前由驱动程序提供_id
值。
如果您不想在域模型中引用MongoDB库(我更喜欢),您可以按如下方式定义您的实体。
public class MyEntity
{
public string Id { get; set; }
public string SomeStringProperty { get; set; }
public DateTime SomeDateTimeProperty { get; set; }
}
然后,直接在持久层中使用此代码将您的实体映射到数据库。
BsonClassMap.RegisterClassMap<MyEntity>(cm =>
{
cm.AutoMap();
cm.MapIdMember(c => c.Id)
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
});
string
在代码中更容易处理ID,但这种方式在数据库中映射为ObjectId
。
注意:如果使用InsertOne()
方法的异步版本,则必须等待插入至少在启动驱动程序设置_id
值之前启动。
答案 1 :(得分:0)
生成MongoDB中的ID on the client side。
如果文档没有指定_id字段,那么MongoDB将在插入之前添加_id字段并为文档指定唯一的ObjectId。大多数驱动程序创建一个ObjectId并插入_id字段,但如果驱动程序或应用程序没有,mongod将创建并填充_id。
在这种情况下,您可以手动生成ObjectIds并从您的方法返回它们(使用ObjectId.GenerateNewId()
)或返回整个对象,因为如果您使用[BsonId]
属性,MongoDB驱动程序将设置正确的_id值
public async Task<T> Create(T entity) where T:class
{
await Collection.InsertOneAsync(entity);
return entity;
}
传递类似参数,如:
public class MyClass
{
[BsonId]
public ObjectId Id { get; set; }
//other properties
}