Estoy usando el controlador C# mongodb para actualizar el registro en mongodb. El siguiente código funciona bien para mí, pero está convirtiendo automáticamente todas las apariciones de "id" en "_id".
var client = GetMongoClient(); var collection1 = GetMongoCollection("collection1"); var collection2 = GetMongoCollection("collection2"); using (var session = await client.StartSessionAsync()) { session.StartTransaction(); try { var filter = Builders<BsonDocument>.Filter.Eq("_id", projectInfo._Id); BsonDocument projectInfoBD = projectInfo.ToBsonDocument(); var recordAfterUpdate = await collection1.ReplaceOneAsync(session, filter, projectInfoBD); ...... } catch (Exception ex) { await session.AbortTransactionAsync(); return false; } }Mis clases de C#
public class ProjectInfo { public string _Id { get; set; } //This is primary key which unique for project info public ProjectBasicDetail BasicDetails { get; set; } } public class ProjectBasicDetail { public string Name { get; set; } public string Description { get; set; } public Option Status { get; set; } public TextOption CreatedBy { get; set; } } public class TextOption { public string Id { get; set; } //don't want to convert to "_id" public string Name { get; set; } } public class Option { public int Id { get; set; } //don't want to convert to "_id" public string Name { get; set; } }Después de actualizar el registro, espero que el registro actualizado se vea así
{ "_id": "kjsldfkjlsdkfjsd", "basicDetails": { "name": "test name", "description": "test desc", "status": { "id": 11, "name": "processing" }, "createdBy": { "id": "123", "name": "some user" } } }pero guardó como debajo de uno. Está convirtiendo todas las ocurrencias de "id" a "_id" que no quiero
{ "_id": "kjsldfkjlsdkfjsd", //This is ok "basicDetails": { "name": "test name", "description": "test desc", "status": { "_id": 11, //This should be "id" "name": "processing" }, "createdBy": { "_id": "123", //This should be "id" "name": "some user" } } }Gracias por adelantado...
El nombre de la propiedad con Id está bloqueado para cambiar el nombre a _id en el lado de Mongo.
Tienes 2 opciones. Llámalo de otra forma en el lado de C#, como IdStr >
public class TextOption { [BsonElement("id")] public string IdStr { get; set; } //don't want to convert to "_id" public string Name { get; set; } } public class Option { [BsonElement("id")] public int IdStr { get; set; } //don't want to convert to "_id" public string Name { get; set; } }O modificar con el mapeo base>
var client = new MongoClient(); var database = client.GetDatabase("test"); var collection = database.GetCollection<ProjectInfo>("projects"); BsonClassMap.RegisterClassMap<TextOption>(cm => { cm.AutoMap(); cm.UnmapProperty(c => c.Id); cm.MapMember(c => c.Id) .SetElementName("id") .SetOrder(0) //specific to your needs .SetIsRequired(true); // again specific to your needs }); BsonClassMap.RegisterClassMap<Option>(cm => { cm.AutoMap(); cm.UnmapProperty(c => c.Id); cm.MapMember(c => c.Id) .SetElementName("id") .SetOrder(0) //specific to your needs .SetIsRequired(true); // again specific to your needs }); using (var session = await client.StartSessionAsync()) { await collection.InsertOneAsync(session, new ProjectInfo { _Id = "604b5fa389ff6887d1b91a91", BasicDetails = new ProjectBasicDetail { CreatedBy = new TextOption { Id = "604b5fa389ff6887d1b91a93", Name = "a" }, Description = "b", Name = "c", Status = new Option { Id = 123, Name = "status name" } } }); } también agregue [BsonId] a su clase ProjectInfo , para que no se duplique y tenga una representación string >
public class ProjectInfo { [BsonId] public string _Id { get; set; } //This is primary key which unique for project info public ProjectBasicDetail BasicDetails { get; set; } }Creo que puede lograr esto fácilmente agregando el atributo [BsonNoId] a la clase de esta manera:
[BsonNoId] public class TextOption { public string Id { get; set; } //don't want to convert to "_id" public string Name { get; set; } } [BsonNoId] public class Option { public int Id { get; set; } //don't want to convert to "_id" public string Name { get; set; } }Esto hará que NO asuma el valor predeterminado para la propiedad denominada Id o id. ¡Espero que esto ayude! ;)