2011-08-29 3 views
5

Plus particulièrement, il y a une classeMongoDB C# driver - Un champ appelé Id ne peut-il pas être Id?

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

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

Je voudrais MyId être un id Y, à savoir d'être mis en correspondance avec _id.

Est-ce possible?

je reçois une exception après ce code:

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

L'exception: { " « MyId » membre de la classe « MongoTest1.Y » ne peut pas utiliser le nom élément « _id » parce qu'il est déjà utilisé par 'Id' membre "}

de cas de test complet.

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 de X doit être une chaîne.

Répondre

9

La réponse à votre question est "oui, mais ...".

Il est possible d'avoir un membre appelé Id qui est pas mis en correspondance avec l'élément _id. Par exemple:

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

public class Y : X { 
    public string Id; 
} 

Cependant, dans une hiérarchie de classe le membre _id doit être à la racine de la hiérarchie (en d'autres termes, tous les membres de la hiérarchie doivent se mettre d'accord sur l'utilisation de la même _id).

Questions connexes