C#MongoDB - 绑定对象属性,插入时_id null

时间:2012-08-28 14:12:19

标签: mongodb mongodb-.net-driver

当我插入Mongo时,我不想定义_id,但我确实想要阅读_id。使用

等对象时
public class MyClass
    {
        public Object _id { get; set;}
        public String propery1 { get; set; }
    }

如果我做

之类的话,我正在写null _id
this.myobj.property1 = "Useless info";    
SafeModeResult result = this.uploads.Insert(uploadedfilecanonical, SafeMode.True);

我是否需要为查询绑定和插入绑定创建单独的类类型,其中insert不定义_id属性但可查询属性?

2 个答案:

答案 0 :(得分:3)

我并不是真的了解你的问题,所以我会在这里尽我所能。如果执行插入操作,如果_id为null,则它将保持为null。如果您使用保存,它将为您创建一个标识符,如果不存在。但是,您使用Object作为您的id,这很奇怪。我们建议您使用ObjectId,整数,Guid或其他东西。

此外,您还可以使用名为" Id"而不是.NET类的非传统_id。或者,您可以使用attribute来表示ID,也可以创建convention来应用常用模式。我强烈建议您阅读tutorial以获取更多信息。

答案 1 :(得分:0)

此处仅ObjectIdGuid作为Id属性的类型。您可以在不使用下划线(并且没有[BsonId]属性)的情况下命名属性。

ObjectId对于mongo来说是很自然的,服务器会创建它并用它来响应,这是最快的方式,AFAIU。 Guid对于.NET来说很自然,但客户端的Mongo驱动程序将生成此ID并将其编码为mongo。 最后两行是.Net Guid如何存储在mongo中。前几行是自然的mongo ObjectIdenter image description here

只要您必须在某处提供引用,ObjectId结构应该适合您。

但是如果你序列化你可能会看到令人不快的结果。可以改变BsonRepresentation并使用属性转换为字符串,例如像这样:

    public class SimpleTask
    {
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
        public string Subject { get; set; }
    }