2011-08-29 3 views
5

더 particulary 내가 MYID _id가 매핑되도록, 즉, Y의 ID 싶습니다 클래스MongoDB C# 드라이버 - Id라는 필드가 Id가 아닌가요?

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

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

있다.

가능합니까?

는이 코드 후 예외가 :

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

예외 : { "이미 사용하고 있기 때문에 요소 이름 '_id'를 사용할 수 없습니다 클래스의 회원 'MYID' 'MongoTest1.Y' 회원의 아이디 ' "}

전체 테스트 케이스 :.

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

X의 ID가 문자열이어야합니다.

답변

9

귀하의 질문에 대한 답변은 "예,하지만 ..."입니다. 그것은

는 _id 요소에 매핑되지 이드이다라는 부재를 가질있다. 예를 들어 :

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

public class Y : X { 
    public string Id; 
} 

그러나, 클래스 계층 구조에서 _id 회원 (즉, 계층 구조의 모든 구성원이 동일한 _id 사용에 동의해야합니다) 계층 구조의 루트에 있어야합니다.

관련 문제