public void Sets_owned_type_keys()
        {
            var builder = new ModelBuilder(new ConventionSet());

            var model = builder.Model;

            ((Model)model).SetProductVersion("2.1.0");

            builder.Entity <Blog>(
                b =>
            {
                b.Property(e => e.Id);
                b.HasKey(e => e.Id);

                b.OwnsOne(e => e.Details).WithOwner().HasForeignKey(e => e.BlogId);
            });

            var reporter = new TestOperationReporter();

            new SnapshotModelProcessor(reporter).Process(model);

            Assert.Empty(reporter.Messages);
            Assert.Equal(
                nameof(BlogDetails.BlogId),
                model.FindEntityType(typeof(Blog)).FindNavigation(nameof(Blog.Details)).GetTargetType().FindPrimaryKey().Properties.Single()
                .Name);
        }
Exemple #2
0
        private MigrationsScaffolder CreateMigrationScaffolder <TContext>()
            where TContext : DbContext, new()
        {
            var currentContext = new CurrentDbContext(new TContext());
            var idGenerator    = new MigrationsIdGenerator();
            var code           = new CSharpHelper();
            var reporter       = new TestOperationReporter();

            return(new MigrationsScaffolder(
                       new MigrationsScaffolderDependencies(
                           currentContext,
                           new Model(),
                           new MigrationsAssembly(
                               currentContext,
                               new DbContextOptions <TContext>().WithExtension(new FakeRelationalOptionsExtension()),
                               idGenerator),
                           new MigrationsModelDiffer(
                               new TestRelationalTypeMapper(new RelationalTypeMapperDependencies()),
                               new MigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies()),
                               new FakeStateManager(),
                               RelationalTestHelpers.Instance.CreateCommandBatchPreparer()),
                           idGenerator,
                           new CSharpMigrationsGenerator(
                               new MigrationsCodeGeneratorDependencies(),
                               new CSharpMigrationsGeneratorDependencies(
                                   code,
                                   new CSharpMigrationOperationGenerator(
                                       new CSharpMigrationOperationGeneratorDependencies(code)),
                                   new CSharpSnapshotGenerator(new CSharpSnapshotGeneratorDependencies(code)))),
                           new MockHistoryRepository(),
                           reporter,
                           new MockProvider(),
                           new SnapshotModelProcessor(reporter))));
        }
Exemple #3
0
    public void GenerateModel_warns_when_output_encoding()
    {
        using var projectDir = new TempDirectory();

        var contextTemplate = Path.Combine(projectDir, "CodeTemplates", "EFCore", "DbContext.t4");

        Directory.CreateDirectory(Path.GetDirectoryName(contextTemplate));
        File.WriteAllText(
            contextTemplate,
            @"<#@ output encoding=""us-ascii"" #>");

        var reporter  = new TestOperationReporter();
        var generator = CreateGenerator(reporter);
        var model     = new ModelBuilder()
                        .FinalizeModel();

        var result = generator.GenerateModel(
            model,
            new()
        {
            ContextName      = "Context",
            ConnectionString = @"Name=DefaultConnection",
            ProjectDir       = projectDir
        });

        Assert.Collection(
            reporter.Messages,
            x =>
        {
            Assert.Equal(LogLevel.Warning, x.Level);
            Assert.Equal(DesignStrings.EncodingIgnored("us-ascii"), x.Message);
        });
    }
        private IMigrationsScaffolder CreateMigrationScaffolder <TContext>()
            where TContext : DbContext, new()
        {
            var currentContext = new CurrentDbContext(new TContext());
            var idGenerator    = new MigrationsIdGenerator();
            var code           = new CSharpHelper();
            var reporter       = new TestOperationReporter();
            var migrationAssembly
                = new MigrationsAssembly(
                      currentContext,
                      new DbContextOptions <TContext>().WithExtension(new FakeRelationalOptionsExtension()),
                      idGenerator);
            var historyRepository = new MockHistoryRepository();

            var services = RelationalTestHelpers.Instance.CreateContextServices();

            return(new MigrationsScaffolder(
                       new MigrationsScaffolderDependencies(
                           currentContext,
                           new Model(),
                           migrationAssembly,
                           new MigrationsModelDiffer(
                               new FallbackRelationalCoreTypeMapper(
                                   TestServiceFactory.Instance.Create <CoreTypeMapperDependencies>(),
                                   TestServiceFactory.Instance.Create <RelationalTypeMapperDependencies>(),
                                   TestServiceFactory.Instance.Create <TestRelationalTypeMapper>()),
                               new MigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies()),
                               services.GetRequiredService <IChangeDetector>(),
                               services.GetRequiredService <StateManagerDependencies>(),
                               services.GetRequiredService <CommandBatchPreparerDependencies>()),
                           idGenerator,
                           new MigrationsCodeGeneratorSelector(
                               new[]
            {
                new CSharpMigrationsGenerator(
                    new MigrationsCodeGeneratorDependencies(),
                    new CSharpMigrationsGeneratorDependencies(
                        code,
                        new CSharpMigrationOperationGenerator(
                            new CSharpMigrationOperationGeneratorDependencies(code)),
                        new CSharpSnapshotGenerator(new CSharpSnapshotGeneratorDependencies(code))))
            }),
                           historyRepository,
                           reporter,
                           new MockProvider(),
                           new SnapshotModelProcessor(reporter),
                           new Migrator(
                               migrationAssembly,
                               historyRepository,
                               services.GetRequiredService <IDatabaseCreator>(),
                               services.GetRequiredService <IMigrationsSqlGenerator>(),
                               services.GetRequiredService <IRawSqlCommandBuilder>(),
                               services.GetRequiredService <IMigrationCommandExecutor>(),
                               services.GetRequiredService <IRelationalConnection>(),
                               services.GetRequiredService <ISqlGenerationHelper>(),
                               services.GetRequiredService <IDiagnosticsLogger <DbLoggerCategory.Migrations> >(),
                               services.GetRequiredService <IDatabaseProvider>()))));
        }
        protected static IServiceCollection CreateServices()
        {
            var testAssembly = typeof(ModelCodeGeneratorTestBase).Assembly;
            var reporter     = new TestOperationReporter();
            var services     = new DesignTimeServicesBuilder(testAssembly, testAssembly, reporter, new string[0])
                               .CreateServiceCollection("Microsoft.EntityFrameworkCore.SqlServer");

            return(services);
        }
        private static IModelCodeGenerator CreateGenerator()
        {
            var testAssembly = typeof(CSharpModelGeneratorTest).Assembly;
            var reporter     = new TestOperationReporter();

            return(new DesignTimeServicesBuilder(testAssembly, testAssembly, reporter, new string[0])
                   .CreateServiceCollection("Microsoft.EntityFrameworkCore.SqlServer")
                   .AddSingleton <IAnnotationCodeGenerator, AnnotationCodeGenerator>()
                   .AddSingleton <IProviderConfigurationCodeGenerator, TestProviderCodeGenerator>()
                   .BuildServiceProvider()
                   .GetRequiredService <IModelCodeGenerator>());
        }
        public void Can_diff_against_older_ownership_model(Type snapshotType)
        {
            using var db = new Ownership.OwnershipContext();
            var differ    = db.GetService <IMigrationsModelDiffer>();
            var snapshot  = (ModelSnapshot)Activator.CreateInstance(snapshotType);
            var reporter  = new TestOperationReporter();
            var processor = new SnapshotModelProcessor(reporter);

            var differences = differ.GetDifferences(processor.Process(snapshot.Model), db.Model);

            Assert.Empty(differences);
        }
Exemple #8
0
        public void Create_works_when_BuildWebHost_throws()
        {
            var reporter = new TestOperationReporter();
            var factory  = new TestAppServiceProviderFactory(
                MockAssembly.Create(typeof(ProgramWithThrowingBuildWebHost)),
                reporter);

            var services = factory.Create(Array.Empty <string>());

            Assert.NotNull(services);
            Assert.Contains(
                "warn: " + DesignStrings.InvokeCreateHostBuilderFailed("This is a test."),
                reporter.Messages);
        }
Exemple #9
0
    public RelationalScaffoldingModelFactoryTest()
    {
        _reporter = new TestOperationReporter();

        var assembly = typeof(RelationalScaffoldingModelFactoryTest).Assembly;

        _factory = new DesignTimeServicesBuilder(assembly, assembly, _reporter, new string[0])
                   .CreateServiceCollection("Microsoft.EntityFrameworkCore.SqlServer")
                   .AddSingleton <IScaffoldingModelFactory, FakeScaffoldingModelFactory>()
                   .BuildServiceProvider(validateScopes: true)
                   .GetRequiredService <IScaffoldingModelFactory>();

        _reporter.Clear();
    }
        public RelationalDatabaseModelFactoryTest()
        {
            _reporter = new TestOperationReporter();

            var services = new ServiceCollection()
                           .AddEntityFrameworkDesignTimeServices(_reporter)
                           .AddSingleton <IScaffoldingModelFactory, FakeScaffoldingModelFactory>();

            new SqlServerDesignTimeServices().ConfigureDesignTimeServices(services);

            _factory = services
                       .BuildServiceProvider()
                       .GetRequiredService <IScaffoldingModelFactory>();
        }
Exemple #11
0
        public SqliteDatabaseModelFactoryTest()
        {
            _testStore = SqliteTestStore.CreateScratch();

            var reporter          = new TestOperationReporter();
            var serviceCollection = new ServiceCollection().AddScaffolding(reporter)
                                    .AddSingleton <IOperationReporter>(reporter);

            new SqliteDesignTimeServices().ConfigureDesignTimeServices(serviceCollection);

            var serviceProvider = serviceCollection.BuildServiceProvider();

            _factory = serviceProvider
                       .GetService <IDatabaseModelFactory>() as SqliteDatabaseModelFactory;
        }
        public void Invoke_warns_on_error()
        {
            var reporter = new TestOperationReporter();

            var startup = new StartupInvoker(
                reporter,
                MockAssembly.Create(typeof(BadStartup)));

            var services = startup.ConfigureServices();

            Assert.NotNull(services);
            Assert.Equal(
                "warn: " + DesignStrings.InvokeStartupMethodFailed(
                    "ConfigureServices",
                    nameof(BadStartup),
                    "Something went wrong."),
                reporter.Messages[0]);
        }
        public void Does_not_process_non_v1_models()
        {
            var model = new Model();

            model.SetProductVersion("2.0.0");
            model["Unicorn:DefaultSchema"] = "Value";

            Assert.Equal(2, model.GetAnnotations().Count());

            var reporter = new TestOperationReporter();

            new SnapshotModelProcessor(reporter).Process(model);

            Assert.Empty(reporter.Messages);

            Assert.Equal(2, model.GetAnnotations().Count());
            Assert.Equal("Value", (string)model["Unicorn:DefaultSchema"]);
        }
        public void Updates_provider_annotations_on_model()
        {
            var builder = new ModelBuilder(new ConventionSet());

            var model = builder.Model;

            ((Model)model).SetProductVersion("1.1.2");

            var entityType = builder.Entity <Blog>().Metadata;
            var property   = builder.Entity <Blog>().Property(e => e.Id).Metadata;
            var key        = builder.Entity <Blog>().HasKey(e => e.Id).Metadata;

            builder.Entity <Post>().Property(e => e.BlogId);
            var foreignKey = builder.Entity <Blog>().HasMany(e => e.Posts).WithOne(e => e.Blog).HasForeignKey(e => e.BlogId).Metadata;
            var nav1       = foreignKey.DependentToPrincipal;
            var nav2       = foreignKey.PrincipalToDependent;

            var index = builder.Entity <Post>().HasIndex(e => e.BlogId).Metadata;

            AddAnnotations(model);
            AddAnnotations(entityType);
            AddAnnotations(property);
            AddAnnotations(key);
            AddAnnotations(foreignKey);
            AddAnnotations(nav1);
            AddAnnotations(nav2);
            AddAnnotations(index);

            var reporter = new TestOperationReporter();

            new SnapshotModelProcessor(reporter).Process(model);

            AssertAnnotations(model);
            AssertAnnotations(entityType);
            AssertAnnotations(property);
            AssertAnnotations(key);
            AssertAnnotations(foreignKey);
            AssertAnnotations(nav1);
            AssertAnnotations(nav2);
            AssertAnnotations(index);

            Assert.Empty(reporter.Messages);
        }
        public void Does_not_warn_for_duplicate_non_conflicting_annotations()
        {
            var model = new ModelBuilder(new ConventionSet()).Model;

            model.SetProductVersion("1.1.2");
            model["Unicorn:DefaultSchema"] = "Value";
            model["Hippo:DefaultSchema"]   = "Value";

            Assert.Equal(3, model.GetAnnotations().Count());

            var reporter = new TestOperationReporter();

            new SnapshotModelProcessor(reporter).Process(model);

            Assert.Empty(reporter.Messages);

            Assert.Equal(2, model.GetAnnotations().Count());
            Assert.Equal("Value", (string)model["Relational:DefaultSchema"]);
        }
        public void Log_dampens_logLevel_when_ExecutedCommand()
        {
            var reporter      = new TestOperationReporter();
            var loggerFactory = new LoggerFactory();

            loggerFactory.AddProvider(new LoggerProvider(categoryName => new OperationLogger(categoryName, reporter)));

            var logger = loggerFactory.CreateLogger <RelationalCommandBuilderFactory>();

            logger.Log <object>(
                LogLevel.Information,
                (int)RelationalEventId.ExecutedCommand,
                null,
                null,
                (_, __) => "-- Can't stop the SQL");

            Assert.Collection(
                reporter.Messages,
                x => Assert.Equal("verbose: -- Can't stop the SQL", x));
        }
Exemple #17
0
    private ServiceProvider CreateDesignServiceProvider(
        string assemblyCode,
        string startupAssemblyCode = null,
        DbContext context          = null)
    {
        var assembly        = Compile(assemblyCode);
        var startupAssembly = startupAssemblyCode == null
            ? assembly
            : Compile(startupAssemblyCode);

        var reporter        = new TestOperationReporter();
        var servicesBuilder = new DesignTimeServicesBuilder(assembly, startupAssembly, reporter, new string[0]);

        return((context == null
                ? servicesBuilder
                .CreateServiceCollection("Microsoft.EntityFrameworkCore.SqlServer")
                : servicesBuilder
                .CreateServiceCollection(context))
               .BuildServiceProvider(validateScopes: true));
    }
Exemple #18
0
        public void Log_dampens_logLevel_when_CommandExecuted()
        {
            var reporter      = new TestOperationReporter();
            var loggerFactory = new LoggerFactory();

            loggerFactory.AddProvider(new OperationLoggerProvider(reporter));

            var logger = loggerFactory.CreateLogger(DbLoggerCategory.Database.Command.Name);

            logger.Log <object>(
                LogLevel.Information,
                RelationalEventId.CommandExecuted,
                null,
                null,
                (_, __) => "-- Can't stop the SQL");

            Assert.Collection(
                reporter.Messages,
                x => Assert.Equal("verbose: -- Can't stop the SQL", x));
        }
        protected E2ETestBase(ITestOutputHelper output)
        {
            _output = output;

            _reporter = new TestOperationReporter();

            var serviceBuilder = new ServiceCollection()
                                 .AddSingleton <IOperationReporter>(_reporter)
                                 .AddScaffolding(_reporter)
                                 .AddLogging();

            ConfigureDesignTimeServices(serviceBuilder);

            var serviceProvider = serviceBuilder
                                  .AddSingleton(typeof(IFileService), sp => InMemoryFiles = new InMemoryFileService())
                                  .BuildServiceProvider();

            Generator = serviceProvider.GetRequiredService <IModelScaffolder>();
            ScaffoldingModelFactory = serviceProvider.GetRequiredService <IScaffoldingModelFactory>();
        }
        public void Warns_for_conflicting_annotations_one_relational()
        {
            var model = new Model();

            model.SetProductVersion("1.1.2");
            model["Unicorn:DefaultSchema"]    = "Value1";
            model["Relational:DefaultSchema"] = "Value2";

            Assert.Equal(3, model.GetAnnotations().Count());

            var reporter = new TestOperationReporter();

            new SnapshotModelProcessor(reporter).Process(model);

            Assert.Equal("warn: " + DesignStrings.MultipleAnnotationConflict("DefaultSchema"), reporter.Messages.Single());
            Assert.Equal(2, model.GetAnnotations().Count());

            var actual = (string)model["Relational:DefaultSchema"];

            Assert.True(actual == "Value1" || actual == "Value2");
        }
Exemple #21
0
    public void GenerateModel_reports_errors()
    {
        using var projectDir = new TempDirectory();

        var contextTemplate = Path.Combine(projectDir, "CodeTemplates", "EFCore", "DbContext.t4");

        Directory.CreateDirectory(Path.GetDirectoryName(contextTemplate));
        File.WriteAllText(
            contextTemplate,
            @"<# Warning(""This is a warning"");
Error(""This is an error""); #>");

        var reporter  = new TestOperationReporter();
        var generator = CreateGenerator(reporter);
        var model     = new ModelBuilder()
                        .FinalizeModel();

        var result = generator.GenerateModel(
            model,
            new()
        {
            ContextName      = "Context",
            ConnectionString = @"Name=DefaultConnection",
            ProjectDir       = projectDir
        });

        Assert.Collection(
            reporter.Messages,
            x =>
        {
            Assert.Equal(LogLevel.Warning, x.Level);
            Assert.Contains("This is a warning", x.Message);
        },
            x =>
        {
            Assert.Equal(LogLevel.Error, x.Level);
            Assert.Contains("This is an error", x.Message);
        });
    }
Exemple #22
0
        public RelationalDatabaseModelFactoryTest()
        {
            _reporter = new TestOperationReporter();

            _factory = new FakeScaffoldingModelFactory(_reporter);
        }
        private IMigrationsScaffolder CreateMigrationScaffolder <TContext>()
            where TContext : DbContext, new()
        {
            var currentContext             = new CurrentDbContext(new TContext());
            var idGenerator                = new MigrationsIdGenerator();
            var sqlServerTypeMappingSource = new SqlServerTypeMappingSource(
                TestServiceFactory.Instance.Create <TypeMappingSourceDependencies>(),
                TestServiceFactory.Instance.Create <RelationalTypeMappingSourceDependencies>());
            var sqlServerAnnotationCodeGenerator = new SqlServerAnnotationCodeGenerator(
                new AnnotationCodeGeneratorDependencies(sqlServerTypeMappingSource));
            var code     = new CSharpHelper(sqlServerTypeMappingSource);
            var reporter = new TestOperationReporter();
            var migrationAssembly
                = new MigrationsAssembly(
                      currentContext,
                      new DbContextOptions <TContext>().WithExtension(new FakeRelationalOptionsExtension()),
                      idGenerator,
                      new FakeDiagnosticsLogger <DbLoggerCategory.Migrations>());
            var historyRepository = new MockHistoryRepository();

            var services = RelationalTestHelpers.Instance.CreateContextServices();
            var model    = new Model().FinalizeModel();

            model.AddRuntimeAnnotation(RelationalAnnotationNames.RelationalModel, new RelationalModel(model));

            return(new MigrationsScaffolder(
                       new MigrationsScaffolderDependencies(
                           currentContext,
                           model,
                           migrationAssembly,
                           new MigrationsModelDiffer(
                               new TestRelationalTypeMappingSource(
                                   TestServiceFactory.Instance.Create <TypeMappingSourceDependencies>(),
                                   TestServiceFactory.Instance.Create <RelationalTypeMappingSourceDependencies>()),
                               new MigrationsAnnotationProvider(
                                   new MigrationsAnnotationProviderDependencies()),
                               services.GetRequiredService <IChangeDetector>(),
                               services.GetRequiredService <IUpdateAdapterFactory>(),
                               services.GetRequiredService <CommandBatchPreparerDependencies>()),
                           idGenerator,
                           new MigrationsCodeGeneratorSelector(
                               new[]
            {
                new CSharpMigrationsGenerator(
                    new MigrationsCodeGeneratorDependencies(
                        sqlServerTypeMappingSource,
                        sqlServerAnnotationCodeGenerator),
                    new CSharpMigrationsGeneratorDependencies(
                        code,
                        new CSharpMigrationOperationGenerator(
                            new CSharpMigrationOperationGeneratorDependencies(
                                code)),
                        new CSharpSnapshotGenerator(
                            new CSharpSnapshotGeneratorDependencies(
                                code, sqlServerTypeMappingSource, sqlServerAnnotationCodeGenerator))))
            }),
                           historyRepository,
                           reporter,
                           new MockProvider(),
                           new SnapshotModelProcessor(reporter, services.GetRequiredService <IModelRuntimeInitializer>()),
                           new Migrator(
                               migrationAssembly,
                               historyRepository,
                               services.GetRequiredService <IDatabaseCreator>(),
                               services.GetRequiredService <IMigrationsSqlGenerator>(),
                               services.GetRequiredService <IRawSqlCommandBuilder>(),
                               services.GetRequiredService <IMigrationCommandExecutor>(),
                               services.GetRequiredService <IRelationalConnection>(),
                               services.GetRequiredService <ISqlGenerationHelper>(),
                               services.GetRequiredService <ICurrentDbContext>(),
                               services.GetRequiredService <IModelRuntimeInitializer>(),
                               services.GetRequiredService <IDiagnosticsLogger <DbLoggerCategory.Migrations> >(),
                               services.GetRequiredService <IRelationalCommandDiagnosticsLogger>(),
                               services.GetRequiredService <IDatabaseProvider>()))));
        }