2011-08-29 19 views
5

Más particularmente, hay una claseControlador MongoDB C# - ¿Puede un campo llamado Id no ser Id?

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

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

me gustaría MyID a ser un id para Y, es decir, estar asignada a _ID.

¿Es posible?

me sale una excepción después de este código:

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

La excepción: { " 'MyID' miembro de la clase 'MongoTest1.Y' no se puede usar elemento de nombre '_id' porque ya está siendo utilizado por 'Id' miembro de "}

caso de prueba completo:.

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 debe ser de cadena.

Respuesta

9

La respuesta a su pregunta es "sí, pero ...".

Se es posible tener un miembro de llamada Id que es no asigna al elemento _id. Por ejemplo:

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

public class Y : X { 
    public string Id; 
} 

Sin embargo, en una jerarquía de clases del miembro _id debe estar en la raíz de la jerarquía (en otras palabras, todos los miembros de la jerarquía deben ponerse de acuerdo sobre el uso de la misma _id).

Cuestiones relacionadas