2011-02-03 41 views
24

Estoy usando la Unidad Oficial MongoDB C# v0.9.1.26831, pero me preguntaba si se da una clase de POCO, de todos modos hay que ignorar ciertas propiedades para que no se inserten.Controlador MongoDB C#: Ignorar Propiedad en Insertar

Por ejemplo, tengo la clase siguiente:

public class GroceryList 
{ 
    public string Name { get; set; } 
    public FacebookList Owner { get; set; } 
    public bool IsOwner { get; set; } 
} 

¿Hay alguna manera, para el IsOwner para no ser insertada al insertar un objeto GroceryList? Básicamente, recojo el objeto de la base de datos, luego establezco la propiedad IsOwner en la capa de la aplicación y luego la devuelvo al controlador, que luego asigna el objeto a un modelo de vista.

Espero que mi pregunta tenga sentido. ¡Gracias!

+0

Did usted ha resuelto su problema? –

+0

Sí, utilicé el atributo BsonIgnore en la propiedad IsOwner y eso resolvió el problema. ¡Gracias! – Abe

Respuesta

35

Parece que el atributo [BsonIgnore] hizo el trabajo.

public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    [BsonIgnore] 
    public bool IsOwner { get; set; } 
} 
+0

agradable, salvó mi día, gracias. –

13

También se puede realizar IsOwner anulable y añadir [BsonIgnoreExtraElements] a clase agujero:

[BsonIgnoreExtraElements] 
public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    public bool? IsOwner { get; set; } 
} 

propiedad con valor nulo será ignorado durante searilization. Pero creo que [BsonIgnore] será mejor para su caso.

+0

si utilizo tanto [BsonIgnoreExtraElements] como [BsonIgnore], todas las propiedades que tengan la anotación [BsonIgnore] se ignorarán independientemente de sus valores, mientras que el resto tendrá valores nulos también se ignorarán. ¿Correcto? – WSK

+0

@WSK [BsonIgnoreExtraElements] ignora los campos de db que no se encuentran en su clase al cargar un documento. BsonIgnore ignora el campo al cargar/guardar un documento. –

4

Como alternativa, si no desea utilizar el atributo por alguna razón (por ejemplo, en caso de que no quiere traer una dependencia adicional para MongoDB.Bson a su DTO), puede hacer lo siguiente:

BsonClassMap.RegisterClassMap<GroceryList>(cm => 
{ 
    cm.AutoMap(); 
    cm.UnmapMember(m => m.IsOwner); 
}); 
1

Por si acaso alguien podría estar interesado en otra forma de hacerlo. A través de las convenciones:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention 
{ 
    public void Apply(BsonMemberMap memberMap) 
    { // more checks will go here for the case above, e.g. type check 
     if (memberMap.MemberName != "DoNotWantToSaveThis") 
      memberMap.SetShouldSerializeMethod(o => false); 
    } 
} 

Y entonces usted necesita para registrar esta convención que una vez durante el arranque de aplicaciones:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention() }, t => true); 
1

probablemente debería querer combinar los dos BsonIgnoreExtraElements atributos y BsonIgnore. El motivo es que BsonIgnore no insertará la propiedad "IsOwner" en su base de datos, pero si tiene instancias "antiguas" en su base de datos que contengan este campo, eliminará estos campos de su modelo en la característica o extenderá su " GroceryList "class y use su nueva clase en el DB obtendrá una excepción:

" Element 'IsOwner' no coincide con ningún campo o propiedad de la clase. "

Otra forma (en lugar de editar que clase de modelo) es el uso de "Registro Clase Mapa" con "SetIgnoreExtraElements" y "UnmapMember" juntos.

En su caso sólo tiene que añadir este código al inicializar el controlador:

BsonClassMap.RegisterClassMap<UserModel>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
    cm.UnmapMember(m => m.IsOwner); 
}); 

Puede leer más sobre Mongo mapeo de clases en:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

Cuestiones relacionadas