2012-07-19 12 views
10

me dieron el resultado de la colección en Mongo, la estructura es la misma que estaelemento 'Id' no coincide con ningún campo o propiedad de la clase

[DataContract] 
public class Father 
{ 
    [BsonId] 
    [DataMember] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

[DataContract] 
public class Child 
{ 
    [DataMember] 
    public string Id { get; set; } 

    [DataMember] 
    public int Name { get; set; } 
} 

Cuando intento esto:

List<Father> f = result.ToList(); 

Llama a Element 'Id' does not match any field or property of class Model.Child

Creo que solo toma 'Id' como algo más.

¿Cómo puedo manejarlo? Gracias

+1

¿Puede dar una lista más completa del código que está causando esta excepción? Por ejemplo, ¿qué son los resultados? Además, ¿puede mostrarnos cómo son los documentos en la base de datos (preferiblemente en formato json)? –

+2

He resuelto este problema agregando un _id en la clase secundaria como lo hice en la clase principal. Supongo que todo el ducument necesita un 'id'. Y si no defino uno, el sistema pensará que hay un '_id' en la clase. Eso hace que no pueda transferir el documento a 'List '. – EasonBlack

+1

Echa un vistazo a las opciones de serialización http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial - puedes marcar cualquier propiedad para ser la identificación, no tiene que ser '_id' por ejemplo – Alex

Respuesta

-1

Su clase Niño probablemente debería especificar que hereda Padre

public class Niño: Padre {...}

Su clase padre probablemente debería añadir atributo de tipo conocido (por WCF).

[DataContract] 
[KnownType(typeof(Child))] 
public class Father 

Si se trata de una MongoCollection ("padres") que se guardan/ir a buscar a través, entonces puede que tenga que registrarse una asignación de clase para cada tipo de niño esperado.

if (!BsonClassMap.IsClassMapRegistered(typeof(Child))) 
{ 
    BsonClassMap.RegisterClassMap<Child>(
     cm => { cm.AutoMap(); }); 
} 

Como @alexjamesbrown mencionado, que no están obligados a nombrar el campo id en el objeto poco '_id'. La idea con la herencia es heredar. Entonces, usar el campo "id" del padre (cualquiera que sea su nombre) debería ser suficiente. No está claro por qué su clase Padre tiene propiedades Id y _id. Uno de ellos probablemente no sea necesario.

+0

No necesita usar herencia. También me he encontrado con este problema. Todavía no sé qué es, pero no creo que la herencia lo resuelva. Me similar, código de trabajo, en otro lugar. – Daryn

+0

Esto me acercó más: http://stackoverflow.com/questions/13859295/strange-behavior-of-mongodb-linq-provider-for-fields-called-id. Eventualmente cambié el nombre de mi campo a algo que contenía algo más que id o _id, tanto en la proyección pocp como mongo. Eso hizo el truco – Daryn

0

todo lo que tiene que hacer es eliminar el [DataMember] en el atributo ObjecId y vincular el Id al Id_objeto_objeto.

por lo que su clase debe tener este aspecto:

[DataContract] 
public class Father 
{ 
    [BsonId] 
    public MongoDB.Bson.ObjectId _id { get; set; } 

    [DataMember] 
    public string Id { 
      get { return _id.ToString(); } 
      set { _id = ObjectId.Parse(value); } 
    } 

    [DataMember] 
    public List<Child> childs { get; set; } 
} 

ps: en su caso, la Identificación del niño debe ser generada manualmente, si se quiere que sea un objectId (Mongo), se quiere han de hacer lo mismo truco por último, a deserializado el objeto, se debe utilizar la referencia newtonsoft.json y hacer como esto

Father = JsonConvert.DeserializeObject<Father>(response.Content); 
+0

Esto realmente no funciona - El ObjectId.Parse (valor) siempre devuelve 0 al campo _id. Mejor simplemente almacenar esto como una cadena en mi humilde opinión – AutomationNation

0

hice frente al mismo er problem.Same ROR se produjo a las var data = query.ToList();

 var collection = db.GetCollection<Product>("Products"); 

     var query = 
      from e in collection.AsQueryable<Product>() 
      where e.name == "kalem" 
      select e; 

     var data = query.ToList(); 

y mi inserto fue la siguiente:

var collection = db.GetCollection<Product>("Products"); 

    collection.InsertBatch(products); 

que resuelve de la siguiente manera.

 ObjectId id = new ObjectId(); 
     var collection = db.GetCollection<Product>("Products"); 

     collection.InsertBatch(products); 
     id = pr.Id; 

y añade a la clase id producto como abajo Clase de producto

class Product 
{ 
    public ObjectId Id { get; set; } 
    public string name { get; set; } 
    public string category { get; set; } 
    public double price { get; set; } 
    public DateTime enterTime { get; set; } 
} 
Cuestiones relacionadas