如何将文档插入MongoDB并使用C#.Net中的InsertOneAsync返回相同的文档或其ID

时间:2018-04-27 19:05:56

标签: c# .net mongodb mongodb-csharp-2.0

我正在编写一个通用方法,就像数据访问层一样,使用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驱动程序。

2 个答案:

答案 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
}