2012-11-10 26 views
8

我已创建了getter和setter方法的简单对象:插入不创建ID?

public class MemberCanonical : IMemberCanonical 
{ 
    public ObjectId Id { get; set; } 
    public String username { get; set; } 
    public String email { get; set; } 
    public String status { get; set; } 
    public IEnumerable<string> roles { get; set; } 
} 

现在我要到一个新的成员插入到与数据库:

try 
{ 
    memberObj.username = username; 
    memberObj.email = email; 
    memberObj.status = "active"; 
    // memberObj.Id = new ObjectId().ToString(); 
    this.membershipcollection.Insert(memberObj, SafeMode.True); 
    return true; 
} 
catch(Exception ex) 
{ 
    return false; 
} 

我希望插入创建一个独特的_id( Id),但没有发生。在插入时,当我查看_id字段时,我会得到“0000000 ....”

我需要做什么才能让Mongo在插入时生成它自己的_id?

+1

有时我喜欢回答我一无所知的科目中的问题。下面是我发现的:您可以使用ObjectId.GenerateNewId()自己生成id。您可以在MemberCanonical的构造函数中执行此操作,也可以在插入ObjectId.Empty时检查Id。接下来,它是*可能*它应该被称为'_id',我对此不太确定。我也尝试使用ObjectId?并将它的值设置为null,但这是一个疯狂的猜测。 – Kobi

+0

它在Id类型为ObjectId时自动创建Id。这是预期的。如果Id不是ObjectId驱动程序将不知道如何创建该Id并使其唯一。因此,必须手动完成。 –

+2

有没有人有一个解决方案,不需要通过持久性问题(如对MongoDB类型的依赖)来污染域模型? – Kurt

回答

11

只需用[BsonId]属性标记您的Id属性,并生成id值就会在那里!

public class MemberCanonical : IMemberCanonical 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 

this.membershipcollection.Insert(memberObj, SafeMode.True); 
var idYouLookingFor = memberObj.Id; 

或者另一种方式,通过@Kobi建议: “使用_id字段名称,而不是ID” 也应该工作。

+1

我刚刚在我的Id属性上使用了[BsonId]属性,我没有得到自动生成的ID值。不过,我的ID属性是一个字符串。你会碰巧知道它是否必须是ObjectId类型? –

+0

顺便说一下,Id属性更新为“ObjectId”类型,*不带*具有“BsonId”属性。 –

-1

使用[BsonId]您想要使用的任何独特属性。你甚至可以忽略ObjectID类型并创建你自己的。

例如:

[BsonId] 
public string studentid{get; set;} 
+1

这与两年前的答案相同。 –

4

我使用[BsonId]属性和构造函数创建的Id值的组合。

例如

public class Something { 

    [BsonId] 
    public string Id { get; set; } 

    public Something() { 
     this.Id = ObjectId.GenerateNewId().ToString(); 
    } 

} 

这是这样,我总有一种填充的ID字段的对象。当从数据库中检索实体时,Id字段将被数据库中的实际Id值覆盖。赢赢。