Exemple #1
0
            /// <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);
                    }
                }
            }