如何将文档插入MongoDB并返回相同的文档或它';在C#Net中使用InsertOneAsync返回s ID

如何将文档插入MongoDB并返回相同的文档或它';在C#Net中使用InsertOneAsync返回s ID,c#,.net,mongodb,mongodb-csharp-2.0,C#,.net,Mongodb,Mongodb Csharp 2.0,我正在编写一个通用方法,其作用类似于数据访问层,使用C#.Net将文档插入MongoDB。我的方法如下所示。这里的Collection是从MongoDB检索到的MongoCollection public async T Create(T entity){ await Collection.InsertOneAsync(entity); } 我想返回插入的实体或MongoDB自动生成的ID。InsertOneAsync方法正在返回任务。我试着改变它如下。但其返回类型为void Collecti

我正在编写一个通用方法,其作用类似于数据访问层,使用C#.Net将文档插入MongoDB。我的方法如下所示。这里的Collection是从MongoDB检索到的MongoCollection

public async T Create(T entity){
await Collection.InsertOneAsync(entity);
}
我想返回插入的实体或MongoDB自动生成的ID。InsertOneAsync方法正在返回任务。我试着改变它如下。但其返回类型为void

Collection.InsertOneAsync(entity).GetAwaiter().GetResult();

是否有方法使用InsertOneAsync方法获取id或实体。我正在为C#使用MongoDB驱动程序。

将生成MongoDB中的ID

如果文档未指定_id字段,则MongoDB将添加_id字段,并在插入之前为文档分配唯一的ObjectId。大多数驱动程序创建ObjectId并插入_id字段,但如果驱动程序或应用程序不创建并填充_id,mongod将创建并填充

在您的情况下,您可以手动生成ObjectId并从方法中返回它们(使用
ObjectId.GenerateNewId()
)或返回整个对象,因为如果您使用
[BsonId]
属性,MongoDB驱动程序将设置正确的_id值

public async Task<T> Create(T entity) where T:class
{
    await Collection.InsertOneAsync(entity);
    return entity;
}

一个好的解决方案是让客户端为您生成
\u id

public class MyEntity
{
    [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
    public ObjectId Id { get; set; }

    public string SomeStringProperty { get; set; }
    public DateTime SomeDateTimeProperty { get; set; }
}
每当在数据库中插入具有空
\u id
的实体时,就会生成
\u id
,插入前由驱动程序提供
\u 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));
});
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.MapIdMember(c=>c.Id)
.SetIdGenerator(StringObjectiveGenerator.Instance)
.SetSerializer(新的StringSerializer(BsonType.ObjectId));
});
string
id在代码中更容易处理,尽管这样它们在数据库中被映射为
ObjectId

BsonClassMap.RegisterClassMap<MyEntity>(cm =>
{
    cm.AutoMap();
    cm.MapIdMember(c => c.Id)
        .SetIdGenerator(StringObjectIdGenerator.Instance)
        .SetSerializer(new StringSerializer(BsonType.ObjectId));
});

小心:如果使用异步版本的
InsertOne()
方法,则必须等待插入操作至少开始,然后才能获取驱动程序设置的
\u id
值。

因此,如果客户端未设置id,InsertOneAsync将更新实体的id属性?当我们返回同一个实体时,它将返回生成的id?@Aravind确切地说,这并不像你说的那样有效。它只是在回报我们过去的一切。生成的id没有返回。@Aravind我已经在控制台应用程序中使用驱动程序V2.5.0和以下代码快速测试了这一点:
var result=p.Create(new MyClass()).GetAwaiter().GetResult()我在
Id
属性下得到生成的ObjectId。你能发你的密码吗?我的错。。你说得对..谢谢@Marcello的详细回答。