繁体   English   中英

嵌入式MongoDB文档在使用C#驱动程序保存时未获得ID

[英]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);
    }
}

foo1foo2获得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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM