/// <summary> /// Updates a generic MongoEntity which is in Modified state /// </summary> public void GenericUpdate(MongoContext ctx, MongoEntity ent, MongoEntity origEnt) { var updatesChanges = new List <UpdateDefinition <T> >(); var updatesCollAdd = new List <UpdateDefinition <T> >(); var updatesCollDel = new List <UpdateDefinition <T> >(); var diffs = origEnt.Compare(ent).ToList(); foreach (var diff in diffs) { if (diff.NewPropertyValue == null && diff.OldPropertyValue == null) { foreach (var x in diff.CollectionElementsToAdd) { updatesCollAdd.Add(Builders <T> .Update.Push(diff.PropertyFullPath, x)); } foreach (var x in diff.CollectionElementsToRemove) { updatesCollDel.Add(Builders <T> .Update.Pull(diff.PropertyFullPath, x)); } } else { updatesChanges.Add(Builders <T> .Update.Set(diff.PropertyFullPath, diff.NewPropertyValue)); } } // do field updates if (updatesChanges.Count > 0) { if (ctx.Debug) { Debug.WriteLine($"Record Updates {updatesChanges.Count}"); foreach (var x in updatesChanges) { Debug.WriteLine($"\t{x.ToString()}"); } } var filter = Builders <T> .Filter.Eq((t) => t.Id, ent.Id); var update = Builders <T> .Update.Combine(updatesChanges); Collection.UpdateMany(filter, update); } // do collection add if (updatesCollAdd.Count > 0) { if (ctx.Debug) { Debug.WriteLine($"Coll Add {updatesCollAdd.Count}"); } foreach (var x in updatesCollAdd) { if (ctx.Debug) { Debug.WriteLine($"\t{x.ToString()}"); } var filter = Builders <T> .Filter.Eq((y) => y.Id, ent.Id); Collection.UpdateOne(filter, x); } } // do collection del if (updatesCollDel.Count > 0) { if (ctx.Debug) { Debug.WriteLine($"Coll Del {updatesCollDel.Count}"); } foreach (var x in updatesCollDel) { if (ctx.Debug) { Debug.WriteLine($"\t{x.ToString()}"); } var filter = Builders <T> .Filter.Eq((y) => y.Id, ent.Id); Collection.UpdateOne(filter, x); } } }