我用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;
}
答案 0 :(得分:2)
每个MongoDB文档都应具有唯一值的_id
字段。这就是为什么当您通过Curso
文档传递零_id
时,MongoDB会为您生成它。
然而,嵌入式文档的情况并非如此。对于MongoDB,嵌入式文档中的_id
字段只是age
或name
的普通字段。这就是为什么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。