2011-06-29 17 views
8

Tôi có tài liệu mongo chứa một mảng tài liệu được nhúng. Các tài liệu được nhúng có thuộc tính có tên là "Id".Duy trì tên thuộc tính Id trong tài liệu được nhúng với mongo Trình điều khiển C#

{ Name: "Outer object", Embedded: [ {Name: "Embedded A", Id: "5f1c591a71dc237199eeaeda"} ] } 

đối tượng C# lập bản đồ của tôi giống như thế này (một đơn giản, rõ ràng)

public class Outer 
{ 
    public string Name { get; set; } 
    public IEnumerable<Inner> Inners { get; set; } 
} 

public class Inner 
{ 
    public string Name { get; set; } 
    public string Id { get; set; } 
} 

Khi tôi viết một bên ngoài cơ sở dữ liệu, C# tài xế thay đổi tên của tài sản Inner.Id để _ID. Làm thế nào để phá vỡ sự đổi tên tự động này? Tôi đã thử sử dụng thuộc tính [BsonElement ("Id")] trên thuộc tính Id, nhưng nó không giúp được gì.

Trả lời

11

MongoDB tài liệu explicitly states:

Documents trong MongoDB được yêu cầu phải có mã khóa, _id, trong đó xác định duy nhất cho họ.

Mặt khác, C thuộc tính # thường pascal hợp cụ thể và không sử dụng tiền tố để thiết kế tài xế apparently decided để lực lập bản đồ Id tài sản để _id cơ sở dữ liệu thuộc tính.

Nếu bạn muốn để ràng buộc một phi _id thuộc tính mà chỉ xảy ra được gọi là Id trong MongoDB, bạn có thể khai báo một thuộc tính với một tên khác hơn Id C# nên tài xế không can thiệp với nó:

public class Inner 
{ 
    public string Name { get; set; } 

    [BsonElement("Id")] 
    public string IdStr { get; set; } 
} 
+0

Đây chỉ là phỏng đoán của tôi. Tôi chưa bao giờ tự mình sử dụng MongoDB. –

+1

Tôi đã đổi tên của thuộc tính thành IdStr và thêm thuộc tính [BsonElement ("Id")] vào thuộc tính. Điều đó hiệu quả. Cảm ơn! –

+0

Cảm ơn câu trả lời này. Nó giải thích một vấn đề chúng tôi đã theo đuổi ngày hôm nay. Không có vấn đề làm thế nào bạn ghi đè lên bản đồ. D-di chuyển về phía họ. : / –

1

Tôi không thể nhận xét để viết câu trả lời mới. Ghi chú của tôi sẽ tiết kiệm được nhiều thời gian cho mọi người. Nếu _id của bạn trong MongoDB là loại ObjectId sau đó trong C# bạn cần phải thêm một số thuộc tính hơn:

[BsonId] 
[BsonRepresentation(BsonType.ObjectId)] 
[BsonElement("Id")] 
public string Subject { get; set; } 
0

Tôi đồng ý với câu trả lời của Dan, nhưng trong một số trường hợp nếu bạn không được phép thay đổi "Id" bất động sản với một thứ khác, bạn có thể thay đổi rõ ràng hành vi trong các bản đồ lớp như dưới đây.

  BsonClassMap.RegisterClassMap<Inner>(cm => 
      { 
       cm.AutoMap(); 
       cm.UnmapProperty(c => c.Id); 
       cm.MapMember(c => c.Id) 
        .SetElementName() 
        .SetOrder(0) //specific to your needs 
        .SetIsRequired(true); // again specific to your needs 
      }); 
Các vấn đề liên quan