public void VerifyAndMerge() { var dbManager = new DatabaseManager(); var database = dbManager.GetDatabase(); var collection = database.GetCollection <IUser>(typeof(IUser).Name); var config = (MapUserConfiguration)ConfigurationManager.GetSection("databasemap"); foreach (UserMap user in config.Users) { var names = user.SubNames.Split(','); foreach (var name in names) { var query = Query.EQ("Name", name); IUser subUser = collection.FindOne(query); if (subUser != null) { query = Query.EQ("Name", user.MainName); IUser mainUser = collection.FindOne(query); if (mainUser == null) { subUser.Name = user.MainName; mainUser = subUser; } else { foreach (var key in subUser.ExtensionPoint.Keys) { IExtension value = null; if (mainUser.ExtensionPoint.TryGetValue(key, out value)) { var merge = value.Merge(subUser.ExtensionPoint[key]); mainUser.ExtensionPoint[key] = merge; } else { mainUser.ExtensionPoint.Add(key, subUser.ExtensionPoint[key]); } } } dbManager.Delete <IUser>(subUser.Id); dbManager.Update <IUser>(mainUser); } } } }