net example create collection c# mongodb mongodb-.net-driver

example - mongodb net c#



MongoDB C#Driver: Ignorar propiedad al insertar (5)

Estoy usando el MongoDB C # Drive v0.9.1.26831 oficial, pero me preguntaba que dada una clase de POCO, ¿hay alguna forma de ignorar ciertas propiedades para no ser insertadas?

Por ejemplo, tengo la siguiente clase:

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

¿Hay alguna forma de que IsOwner no se inserte cuando inserto un objeto GroceryList? Básicamente, obtengo el objeto de la base de datos, luego configuro la propiedad IsOwner en la capa de la aplicación y luego la devuelvo al controlador, lo que luego asigna el objeto a un modelo de vista.

Espero que mi pregunta tenga sentido. ¡Gracias!


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

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


Parece que el atributo [BsonIgnore] hizo el trabajo.

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


Por si acaso alguien podría estar interesado en otra forma de hacerlo. Vía 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 luego necesitas registrar esta convención una vez durante el inicio de tu aplicación:

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


Probablemente debería querer combinar los dos atributos BsonIgnoreExtraElements 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 contenían este campo y eliminará estos campos de su modelo en la función o ampliará su "Lista de compras" "clase y use su nueva clase en la base de datos obtendrá una excepción:

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

Otra forma (en lugar de editar tu clase de modelo) es usar " Registrar mapa de clase " con " SetIgnoreExtraElements" y "UnmapMember" juntos.

En su caso, simplemente agregue este código cuando inicialice su controlador:

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

Puedes leer más sobre el Mapeo de clases de Mongo en:

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


También puedes hacer IsOwner Nullable y agregar [BsonIgnoreExtraElements] a la clase de agujero:

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

Las propiedades con valor nulo se ignorarán durante la searilización. Pero creo que [BsonIgnore] será mejor para su caso.