自动生成对象Id mongo db c#

时间:2018-02-04 02:55:06

标签: c# database mongodb identity mongodb-.net-driver

我用C#学习mongodb,我想创建一个包含实体列表的记录,但是子实体没有生成他的对象id。

这是我的代码:

_.result(this, 'defaults')

Alumno实体:

public class Curso
{
    [BsonId]
    public ObjectId _id { get; set; }

    [BsonElement("descripcion")]
    public string descripcion { get; set; }

    [BsonElement("horas")]
    public int horas { get; set; }

    [BsonElement("alumnos")]
    public IEnumerable<Alumno> alumnos { get; set; }

    public Curso()
    {

    }
}

我插入了一个新课程,自动生成ID Curso已经工作,但是Alumno id没有生成,而是设置为public class Alumno { [BsonId] public ObjectId _id { get; set; } [BsonElement("name")] public string name { get; set; } [BsonElement("age")] public int age { get; set; } }

"000000000000000000000000"

结果:

    public Curso create(Curso curso)
    {
        db.GetCollection<Curso>("curso").Save(curso);
        return curso;
    }

2 个答案:

答案 0 :(得分:2)

每个MongoDB文档都应具有唯一值的_id字段。这就是为什么当您通过Curso文档传递零_id时,MongoDB会为您生成它。

然而,嵌入式文档的情况并非如此。对于MongoDB,嵌入式文档中的_id字段只是agename的普通字段。这就是为什么MongDB不会为填充_id嵌入文档而烦恼,并在你通过时保存它们,即零填充。

因此,您应该自己为Alumno._id生成值。您可以在Alumno构造函数中或在将文档插入数据库之前执行此操作:

public class Alumno
{
    [BsonId]
    public ObjectId _id { get; set; }

    [BsonElement("name")]
    public string name { get; set; }

    [BsonElement("age")]
    public int age { get; set; }

    public Alumno()
    {
        _id = ObjectId.GenerateNewId();
    }
}

答案 1 :(得分:0)

您还可以使用以下属性声明您的属性:

[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public ObjectId? _id { get; set; }

这将生成一个 id。