Ejemplo n.º 1
0
        public void CheckDatabaseSchemaAgainstEntityFrameworkExpectedSchema()
        {
            using (var container = new Container(c =>
            {
                c.AddRegistry <ConfigurationRegistry>();
            }))
            {
                var configuration = container.GetInstance <ProviderRelationshipsConfiguration>();

                using (var connection = new SqlConnection(configuration.DatabaseConnectionString))
                {
                    var optionsBuilder = new DbContextOptionsBuilder <ProviderRelationshipsDbContext>().UseSqlServer(connection);

                    using (var context = new ProviderRelationshipsDbContext(optionsBuilder.Options))
                    {
                        var config = new CompareEfSqlConfig
                        {
                            TablesToIgnoreCommaDelimited = "ClientOutboxData,OutboxData"
                        };

                        config.IgnoreTheseErrors("EXTRA IN DATABASE: SFA.DAS.ProviderRelationships.Database->Column 'Users', column name. Found = Id");

                        var comparer  = new CompareEfSql(config);
                        var hasErrors = comparer.CompareEfWithDb(context);

                        hasErrors.Should().BeFalse(comparer.GetAllErrors);
                    }
                }
            }
        }
        public void CompareReadOnlyDbContextIgnoreNormalClasses()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <ReadOnlyDbContext>(
                builder => builder.ReplaceService <IModelCacheKeyFactory, ReadOnlyModelCacheKeyFactory>());

            using var context = new ReadOnlyDbContext(options);
            context.Database.EnsureClean();
            var filepath = TestData.GetFilePath("AddViewToDatabase.sql");

            context.ExecuteScriptFileInTransaction(filepath);

            var config = new CompareEfSqlConfig
            {
                TablesToIgnoreCommaDelimited = "NormalClasses"
            };

            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeTrue();
            var errors = CompareLog.ListAllErrors(comparer.Logs).ToList();

            errors.Count.ShouldEqual(3);
            errors[0].ShouldEqual(
                "NOT CHECKED: Entity 'MappedToQuery', not mapped to database. Expected = <null>, found = MappedToQuery");
            errors[1].ShouldEqual(
                "NOT IN DATABASE: MappedToQuery->Entity 'NormalClass', table name. Expected = NormalClasses");
            errors[2].ShouldEqual(
                "NOT IN DATABASE: MappedToQuery->Entity 'MappedToView', table name. Expected = NormalClasses");
        }
Ejemplo n.º 3
0
        public void CheckDatabaseSchemaAgainstEntityFrameworkExpectedSchema()
        {
            const string databaseName = "SFA.DAS.EmployerFinanceV2.Database";

            var configuration = new ConfigurationBuilder().AddAzureTableStorage(EmployerFinanceConfigurationKeys.Base).Build();
            var employerFinanceConfiguration = configuration.GetEmployerFinanceSection <EmployerFinanceConfiguration>();

            using (var connection = new SqlConnection(employerFinanceConfiguration.DatabaseConnectionString))
            {
                var optionsBuilder = new DbContextOptionsBuilder <EmployerFinanceDbContext>().UseSqlServer(connection);

                using (var context = new EmployerFinanceDbContext(optionsBuilder.Options))
                {
                    var config = new CompareEfSqlConfig
                    {
                        TablesToIgnoreCommaDelimited = "ClientOutboxData,OutboxData,SchemaVersions,Users"
                    };

                    config.IgnoreTheseErrors(
                        $"EXTRA IN DATABASE: {databaseName}->Index 'AccountPayeSchemes', index constraint name. Found = AK_AccountPayeSchemes_AccountId_EmployerReferenceNumber{Environment.NewLine}" +
                        $"EXTRA IN DATABASE: {databaseName}->Index 'LevyDeclarationSagas', index constraint name. Found = UK_LevyDeclarationSagas_PayrollPeriod{Environment.NewLine}" +
                        $"EXTRA IN DATABASE: {databaseName}->Index 'LevyDeclarationSagas', index constraint name. Found = UK_LevyDeclarationSagas_PayrollPeriod_AccountPayeSchemeId");

                    var comparer  = new CompareEfSql(config);
                    var hasErrors = comparer.CompareEfWithDb(context);

                    hasErrors.Should().BeFalse(comparer.GetAllErrors);
                }
            }
        }
Ejemplo n.º 4
0
        public void CompareTptContextSuppressViaIgnoreTheseErrors()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <TptDbContext>();

            using var context = new TptDbContext(options);
            context.Database.EnsureClean();

            var config = new CompareEfSqlConfig();

            config.IgnoreTheseErrors(@"DIFFERENT: TptVer1->PrimaryKey 'PK_TptBases', constraint name. Expected = PK_TptBases, found = PK_TptVer1
DIFFERENT: TptVer1->Property 'Id', value generated. Expected = OnAdd, found = Never
DIFFERENT: TptVer1->ForeignKey 'FK_TptVer1_TptBases_Id', delete behavior. Expected = ClientCascade, found = NoAction
DIFFERENT: Entity 'TptVer1', constraint name. Expected = PK_TptBases, found = PK_TptVer1
DIFFERENT: TptVer2->PrimaryKey 'PK_TptBases', constraint name. Expected = PK_TptBases, found = PK_TptVer2
DIFFERENT: TptVer2->Property 'Id', value generated. Expected = OnAdd, found = Never
DIFFERENT: TptVer2->ForeignKey 'FK_TptVer2_TptBases_Id', delete behavior. Expected = ClientCascade, found = NoAction
DIFFERENT: Entity 'TptVer2', constraint name. Expected = PK_TptBases, found = PK_TptVer2");

            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeFalse(comparer.GetAllErrors);
        }
        public void CompareReadOnlyDbContextDifferentColumnType()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <ReadOnlyDbContext>(
                builder => builder.ReplaceService <IModelCacheKeyFactory, ReadOnlyModelCacheKeyFactory>());

            using var context = new ReadOnlyDbContext(options, ReadOnlyDbContext.Configs.BadMappedToViewClass);
            context.Database.EnsureClean();
            context.Database.ExecuteSqlRaw(
                "CREATE OR ALTER VIEW MyView AS SELECT Id, MyDateTime, MyString FROM NormalClasses");

            var config = new CompareEfSqlConfig();

            config.IgnoreTheseErrors(
                "NOT CHECKED: Entity 'MappedToQuery', not mapped to database. Expected = <null>, found = MappedToQuery");
            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeTrue();
            var errors = CompareLog.ListAllErrors(comparer.Logs).ToList();

            (errors.Count == 2).ShouldBeTrue(comparer.GetAllErrors);
            errors[0].ShouldEqual("DIFFERENT: MappedToViewBad->Property 'MyString', column type. Expected = int, found = nvarchar(max)");
            errors[1].ShouldEqual("DIFFERENT: MappedToViewBad->Property 'MyString', nullability. Expected = NOT NULL, found = NULL");
        }
        public void CompareReadOnlyDbContextMissingView()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <ReadOnlyDbContext>(
                builder => builder.ReplaceService <IModelCacheKeyFactory, ReadOnlyModelCacheKeyFactory>());

            using var context = new ReadOnlyDbContext(options);
            context.Database.EnsureClean();
            context.Database.ExecuteSqlRaw(
                "CREATE OR ALTER VIEW MyView AS SELECT Id, MyDateTime FROM NormalClasses");

            var config = new CompareEfSqlConfig();

            config.IgnoreTheseErrors(
                "NOT CHECKED: Entity 'MappedToQuery', not mapped to database. Expected = <null>, found = MappedToQuery");
            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeTrue();
            var errors = CompareLog.ListAllErrors(comparer.Logs).ToList();

            (errors.Count == 1).ShouldBeTrue(comparer.GetAllErrors);
            errors[0].ShouldEqual(
                "NOT IN DATABASE: MappedToView->Property 'MyString', column name. Expected = <null>");
        }
        public void CompareSuppressViaViaAddIgnoreCompareLog()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <BookContext>();

            using var context = new BookContext(options);
            context.Database.EnsureClean();
            var filepath = TestData.GetFilePath("AddViewToBookContext.sql");

            context.ExecuteScriptFileInTransaction(filepath);

            var config = new CompareEfSqlConfig
            {
                //This tells EfSchemaCompare to look at ALL tables and views
                TablesToIgnoreCommaDelimited = ""
            };

            //This will ignore any Table or View that is not accessed by EF Core
            config.AddIgnoreCompareLog(new CompareLog(CompareType.Table, CompareState.ExtraInDatabase, null));
            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeFalse(comparer.GetAllErrors);
        }
Ejemplo n.º 8
0
 public Stage1Comparer(IModel model, string dbContextName, CompareEfSqlConfig config = null, List <CompareLog> logs = null)
 {
     _model          = model;
     _dbContextName  = dbContextName;
     _logs           = logs ?? new List <CompareLog>();
     _ignoreList     = config?.LogsToIgnore ?? new List <CompareLog>();
     _caseComparer   = config?.CaseComparer ?? StringComparer.CurrentCulture;
     _caseComparison = _caseComparer.GetStringComparison();
 }
 public Stage1Comparer(DbContext context, CompareEfSqlConfig config = null, List <CompareLog> logs = null)
 {
     _model                 = context.Model;
     _dbContextName         = context.GetType().Name;
     _relationalTypeMapping = context.GetService <IRelationalTypeMappingSource>();
     _logs           = logs ?? new List <CompareLog>();
     _ignoreList     = config?.LogsToIgnore ?? new List <CompareLog>();
     _caseComparer   = StringComparer.CurrentCulture;        //Turned off CaseComparer as doesn't work with EF Core 5
     _caseComparison = _caseComparer.GetStringComparison();
 }
        public void CompareBookAgainstBookOrderDatabaseSurpressExtraInDatabaseTables()
        {
            //SETUP
            using (var context = new BookContext(GetBookContextOptions()))
            {
                var config = new CompareEfSqlConfig();
                config.AddIgnoreCompareLog(new CompareLog(CompareType.Table, CompareState.ExtraInDatabase, null));
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var hasErrors = comparer.CompareEfWithDb(_connectionString, context);

                //VERIFY
                hasErrors.ShouldBeFalse(comparer.GetAllErrors);
            }
        }
Ejemplo n.º 11
0
        public void TestDifferentDefaultValuesSuppressDefaultValueErrors()
        {
            //SETUP
            using (var context = new Issue15DbContext(_options))
            {
                var config = new CompareEfSqlConfig();
                config.AddIgnoreCompareLog(new CompareLog(CompareType.Property, CompareState.Different, null, CompareAttributes.DefaultValueSql));
                config.AddIgnoreCompareLog(new CompareLog(CompareType.Property, CompareState.Different, null, CompareAttributes.ValueGenerated, "OnAdd", "Never"));
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var hasErrors = comparer.CompareEfWithDb(context);

                //VERIFY
                hasErrors.ShouldBeFalse(comparer.GetAllErrors);
            }
        }
Ejemplo n.º 12
0
        public void CompareLowerCaseToUpperCaseDatabase()
        {
            //SETUP
            using (var context = new Issue19LowerCaseDbContext(_lowerCaseOptions))
            {
                var config = new CompareEfSqlConfig {
                    CaseComparer = StringComparer.CurrentCultureIgnoreCase
                };
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var hasErrors = comparer.CompareEfWithDb(_fullCaseConnectionString, context);

                //VERIFY
                hasErrors.ShouldBeFalse(comparer.GetAllErrors);
            }
        }
        public void CompareEfSqlConfigBadTableToIgnore()
        {
            //SETUP
            using (var context = new BookContext(GetBookContextOptions()))
            {
                var config = new CompareEfSqlConfig
                {
                    TablesToIgnoreCommaDelimited = "BadTableName"
                };
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var ex = Assert.Throws <InvalidOperationException>(() => comparer.CompareEfWithDb(_connectionString, context));

                //VERIFY
                ex.Message.ShouldEqual("The TablesToIgnoreCommaDelimited config property contains a table name of 'BadTableName', which was not found in the database");
            }
        }
        public void CompareBookAgainstBookOrderDatabaseIgnoreTables()
        {
            //SETUP
            using (var context = new BookContext(GetBookContextOptions()))
            {
                var config = new CompareEfSqlConfig
                {
                    TablesToIgnoreCommaDelimited = "Orders,LineItem"
                };
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var hasErrors = comparer.CompareEfWithDb(_connectionString, context);

                //VERIFY
                hasErrors.ShouldBeFalse(comparer.GetAllErrors);
            }
        }
Ejemplo n.º 15
0
        public void LogNotInDatabaseIgnore()
        {
            //SETUP
            bool errorLogged = false;
            var  logs        = new List <CompareLog>();
            var  config      = new CompareEfSqlConfig();

            config.AddIgnoreCompareLog(new CompareLog(CompareType.Entity, CompareState.NotInDatabase, null));

            //ATTEMPT
            var logger = new CompareLogger2(CompareType.Entity, "Test", logs, config.LogsToIgnore,
                                            () => { errorLogged = true; });

            logger.NotInDatabase("MyValue");

            //VERIFY
            errorLogged.ShouldBeFalse();
            logs.Count.ShouldEqual(0);
        }
        public void CompareBookAgainstBookOrderDatabaseHasErrors()
        {
            //SETUP
            using (var context = new BookContext(GetBookContextOptions()))
            {
                var config = new CompareEfSqlConfig {
                    TablesToIgnoreCommaDelimited = ""
                };
                var comparer = new CompareEfSql(config);

                //ATTEMPT
                var hasErrors = comparer.CompareEfWithDb(_connectionString, context);

                //VERIFY
                hasErrors.ShouldBeTrue();
                var errors = CompareLog.ListAllErrors(comparer.Logs).ToList();
                errors.Count.ShouldEqual(2);
                errors[0].ShouldEqual(
                    "EXTRA IN DATABASE: EfCore.TestSupport-Test_ComparerBooksAndOrders->Table 'Orders'");
                errors[1].ShouldEqual(
                    "EXTRA IN DATABASE: EfCore.TestSupport-Test_ComparerBooksAndOrders->Table 'LineItem'");
            }
        }
        public void CompareReadOnlyDbContextOk()
        {
            //SETUP
            var options = this.CreateUniqueClassOptions <ReadOnlyDbContext>(
                builder => builder.ReplaceService <IModelCacheKeyFactory, ReadOnlyModelCacheKeyFactory>());

            using var context = new ReadOnlyDbContext(options);
            context.Database.EnsureClean();
            context.Database.ExecuteSqlRaw(
                "CREATE OR ALTER VIEW MyView AS SELECT Id, MyDateTime, MyString FROM NormalClasses");

            var config = new CompareEfSqlConfig();

            config.IgnoreTheseErrors(
                "NOT CHECKED: Entity 'MappedToQuery', not mapped to database. Expected = <null>, found = MappedToQuery");
            var comparer = new CompareEfSql(config);

            //ATTEMPT
            var hasErrors = comparer.CompareEfWithDb(context);

            //VERIFY
            hasErrors.ShouldBeFalse(comparer.GetAllErrors);
        }
Ejemplo n.º 18
0
 public Stage2Comparer(DatabaseModel databaseModel, CompareEfSqlConfig config = null)
 {
     _databaseModel = databaseModel;
     _ignoreList    = config?.LogsToIgnore ?? new List <CompareLog>();
     _caseComparer  = config?.CaseComparer ?? StringComparer.CurrentCulture;
 }
 public Stage2Comparer(DatabaseModel databaseModel, CompareEfSqlConfig config = null)
 {
     _databaseModel = databaseModel;
     _ignoreList    = config?.LogsToIgnore ?? new List <CompareLog>();
     _caseComparer  = StringComparer.CurrentCulture;         //Turned off CaseComparer as doesn't work with EF Core 5
 }