2011-08-29 23 views
5

More particulary, có một lớpTrình điều khiển MongoDB C# - Có thể một trường được gọi là Id không phải là Id không?

class X { 
     .... 
     string Id { get; set; } 
} 

class Y : X { 
     ObjectId MyId { get; set; } 
} 

Tôi muốn myid là một id cho Y, nghĩa là để được ánh xạ tới _id.

Có thể không?

tôi nhận được một ngoại lệ sau khi mã này:

var ys = database.GetCollection("ys"); 
ys.InsertBatch(new Y[] { new Y(), new Y()}); 

Trường hợp ngoại lệ: { "Thành viên 'myid' của lớp 'MongoTest1.Y' không thể sử dụng tên phần tử '_id' bởi vì nó đang được sử dụng bởi thành viên 'Id' "}

Full kiểm tra trường hợp:.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using MongoDB.Bson; 
using MongoDB.Bson.Serialization; 
using MongoDB.Driver; 

namespace MongoTest1 
{ 
    class X 
    { 
     public string Id { get; set; } 
    } 

    class Y : X 
    { 
     public ObjectId MyId { get; set; } 
    } 

    class Program 
    { 
     static Program() { 
      BsonClassMap.RegisterClassMap<X>(cm => 
      { 
       cm.AutoMap(); 
       cm.SetIdMember(cm.GetMemberMap(c => c.Id)); 
      }); 

      BsonClassMap.RegisterClassMap<Y>(cm => 
      { 
       cm.AutoMap(); 
       cm.SetIdMember(cm.GetMemberMap(c => c.MyId)); 
      }); 
     } 

     static void Main(string[] args) 
     { 
      var server = MongoServer.Create("mongodb://evgeny:[email protected]:27017/test"); 
      var database = server.GetDatabase("test"); 

      using (server.RequestStart(database)) 
      { 
       var ys = database.GetCollection("ys"); 
       ys.InsertBatch(
         new Y[] { 
          new Y(), new Y() 
         } 
        ); 
      } 
     } 
    } 
} 

Id X pHẢI chuỗi.

Trả lời

9

Câu trả lời cho câu hỏi của bạn là "có, nhưng ...".

có thể có thành viên có tên Id là không phải được ánh xạ tới phần tử _id. Ví dụ:

public class X { 
    [BsonId] 
    public ObjectId MyId; 
} 

public class Y : X { 
    public string Id; 
} 

Tuy nhiên, trong một hệ thống phân cấp lớp các thành viên _id phải được ở thư mục gốc của hệ thống phân cấp (hay nói cách khác, tất cả các thành viên của hệ thống phân cấp phải đồng ý về cách sử dụng cùng một _id).

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