[英]Embedded MongoDB Document not getting an ID on save with C# Driver
当我有一个包含文档列表的根文档并保存/插入时,根文档始终从MongoDB获取ID,但列表中的文档却没有,它们与ObjectId.Empty
相同。 我不确定我是在做错什么,还是这是预期的行为?
这是我要尝试执行的示例:给定类:
public class Foo
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public IList<Bar> Bars { get; set; }
}
public class Bar
{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
设有工厂:
public class Factory
{
public Foo CreateFoo(string name)
{
return new Foo {
Id = new ObjectId(),
Name = name,
Bars = new List<Bar>()
};
}
public Bar CreateBar(string name)
{
return new Bar {
Id = new ObjectId(),
Name = name
};
}
}
当我运行这样的示例时:
public class Program
{
static void Main(string[] args)
{
var client = new MongoClient("mongodb://localhost");
var server = client.GetServer();
var database = server.GetDatabase("Example1");
if (!database.CollectionExists("foos")) database.CreateCollection("foos");
var factory = new Factory();
var foo1 = factory.CreateFoo("first");
foo1.Bars.Add(factory.CreateBar("bar"));
var collection = database.GetCollection("foos");
collection.Insert(foo1);
var foo2 = factory.CreateFoo("second");
collection.Insert(foo2);
foo2.Bars.Add(factory.CreateBar("bar"));
collection.Save(foo2);
}
}
foo1
和foo2
获得MongoDB生成的_id
,但是Bars
都没有。 所有Bars
仍然有ObjectId.Empty
。 现在,一个简单的解决方案是将工厂更新为使用ObjectId.GenerateNewId()
,但是我很乐意从数据库生成它。 有人对此有见识吗? 难道我做错了什么? 这有可能吗? 感谢您的输入。
这是预期的行为。 每个文档(不是子文档)都有一个_id,如果为空,则会自动分配。
您或者需要有一个单独的Bar集合并从Foo文档中引用它,或者手动生成ObjectId。
如果您是从工厂[或存储库]进行的,那么它将是可靠的。
编辑:
另外,如果您使用
[BsonRepresentation(BsonType.ObjectId)]
string Id {get;set;}
这意味着您可以更轻松地访问objectId值,但仍将其保存为ObjectId。
仅当将字段标识为集合的_id
时,驱动程序才会为您生成ID字段。 在您的情况下, Bar
嵌入在Foo
文档中。
因此, Bar
具有一个自动生成的ID字段是没有意义的。
在您的示例中,实际上没有理由让Bar
具有唯一的_id
。 查询集合时,将基于Foo
的_id
进行查询,并且响应中将具有Bar
对象。
这绝对是预期的行为。
有一种常见的方案来更新或删除嵌入文档集合的一个元素。 唯一的方法是依靠id。
目前,我已经构建了一个自定义的IIdGenerator并将其分配给IdMemberMap,但是只为根文档调用它。
还有其他方法可以为嵌入文档生成自动ID吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.