2012-11-10 29 views
8

tôi đã tạo ra một đối tượng đơn giản với getter và setter:chèn không tạo 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; } 
} 

Bây giờ tôi muốn chèn một thành viên mới vào cơ sở dữ liệu với:

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; 
} 

Tôi mong chờ chèn để tạo ra một _id độc đáo (Id), nhưng điều đó không xảy ra. Khi chèn khi tôi xem trường _id, tôi nhận được "0000000 ...."

Tôi cần làm gì để Mongo tự tạo _id khi chèn?

+1

Thỉnh thoảng tôi muốn trả lời các câu hỏi trong các chủ đề mà tôi không biết. Đây là những gì tôi phát hiện ra: Bạn có thể tự tạo các id bằng cách sử dụng 'ObjectId.GenerateNewId()' - Bạn có thể thực hiện nó trong hàm tạo của 'MemberCanonical', hoặc kiểm tra Id trong khi chèn vào' ObjectId.Empty'. Tiếp theo, nó là * có thể * nó nên được gọi là '_id', tôi không hoàn toàn chắc chắn về điều đó. Tôi cũng cố gắng sử dụng 'ObjectId?' Và đặt giá trị của nó thành 'null', nhưng đó là một phỏng đoán hoang dã. – Kobi

+0

Tự động tạo Id khi loại Id là ObjectId. đó là như mong đợi. Nếu Id không phải là trình điều khiển ObjectId sẽ không biết cách tạo Id đó và làm cho nó độc đáo. Do đó, việc này phải được thực hiện thủ công. –

+2

Có ai có một giải pháp không yêu cầu gây ô nhiễm mô hình miền với các mối quan tâm dai dẳng như sự phụ thuộc vào các kiểu MongoDB không? – Kurt

Trả lời

11

Chỉ cần đánh dấu thuộc tính Id của bạn với thuộc tính [BsonId] và giá trị id được tạo sẽ ở đó!

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

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

Hoặc thay thế bằng cách nào, được đề xuất bởi @Kobi: "tên trường sử dụng _id thay vì Id" cũng nên làm việc.

+1

Tôi vừa sử dụng thuộc tính [BsonId] trên thuộc tính Id của mình và tôi không nhận được giá trị ID được tạo tự động. Thuộc tính Id của tôi là một chuỗi. Bạn có muốn biết nếu nó có kiểu ObjectId không? –

+0

Nhân tiện, thuộc tính Id được cập nhật khi nó thuộc loại 'ObjectId' và * không có * có thuộc tính' BsonId'. –

-1

Sử dụng [BsonId] trên bất kỳ thuộc tính duy nhất nào bạn muốn sử dụng. Bạn thậm chí có thể bỏ qua loại ObjectID và tạo của riêng bạn.

Ví dụ:

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

Điều này giống hệt với câu trả lời từ hai năm trước. –

4

tôi sử dụng một sự kết hợp của [BsonId] thuộc tính và các nhà xây dựng để tạo ra giá trị Id.

Ví dụ

public class Something { 

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

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

} 

Đây là vì vậy mà tôi luôn luôn có một lĩnh vực Id dân cư cho các đối tượng. Khi thực thể được lấy ra từ cơ sở dữ liệu, trường Id được ghi đè bằng giá trị Id thực tế từ cơ sở dữ liệu. Giành chiến thắng.

Các vấn đề liên quan