/// <summary>
        /// Returns a <see cref="RelationalModelTransform"/> object that describe the changes
        /// required to transform the initial model into the desired model.
        /// </summary>
        /// <param name="initial"></param>
        /// <param name="desired"></param>
        /// <returns></returns>
        public RelationalModelTransform CompareModels(RelationalModelInfo initial, RelationalModelInfo desired)
        {
            var changes = new List <RelationalModelChange>();

            // compare tables
            changes.AddRange(
                CompareSets(initial.Tables, desired.Tables,
                            AddTable,
                            DropTable,
                            CompareTables)
                );

            if (_enumOption != EnumOptions.None)
            {
                // compare enumeration values
                changes.AddRange(
                    CompareSets(initial.Enumerations, desired.Enumerations,
                                item => AddEnumeration(desired.GetTable(item.Table), item),
                                item => DropEnumeration(initial.GetTable(item.Table), item),
                                (x, y) => CompareEnumerations(desired.GetTable(y.Table), x, y))
                    );
            }

            return(new RelationalModelTransform(changes));
        }