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>())))); }
public CSharpMigrationsGenerator( [NotNull] CSharpHelper codeHelper, [NotNull] CSharpMigrationOperationGenerator operationGenerator, [NotNull] CSharpSnapshotGenerator modelGenerator) { Check.NotNull(codeHelper, nameof(codeHelper)); Check.NotNull(operationGenerator, nameof(operationGenerator)); Check.NotNull(modelGenerator, nameof(modelGenerator)); _code = codeHelper; _operationGenerator = operationGenerator; _modelGenerator = modelGenerator; }
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(); var services = RelationalTestHelpers.Instance.CreateContextServices(); 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()), 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)))) }), new MockHistoryRepository(), reporter, new MockProvider(), new SnapshotModelProcessor(reporter)))); }
private MigrationsScaffolder CreateMigrationScaffolder <TContext>() where TContext : DbContext, new() { var context = new TContext(); var idGenerator = new MigrationsIdGenerator(); var code = new CSharpHelper(); return(new MigrationsScaffolder( context, new Model(), new MigrationsAssembly( context, new DbContextOptions <TContext>().WithExtension(new MockRelationalOptionsExtension()), idGenerator), new MigrationsModelDiffer( new TestRelationalTypeMapper(), new TestAnnotationProvider(), new MigrationsAnnotationProvider()), idGenerator, new CSharpMigrationsGenerator(code, new CSharpMigrationOperationGenerator(code), new CSharpSnapshotGenerator(code)), new MockHistoryRepository(), new LoggerFactory(), new MockProviderServices())); }
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>())))); }
public void Migrations_compile() { var codeHelper = new CSharpHelper(); var generator = new CSharpMigrationsGenerator( new MigrationsCodeGeneratorDependencies(), new CSharpMigrationsGeneratorDependencies( codeHelper, new CSharpMigrationOperationGenerator( new CSharpMigrationOperationGeneratorDependencies(codeHelper)), new CSharpSnapshotGenerator(new CSharpSnapshotGeneratorDependencies(codeHelper)))); var migrationCode = generator.GenerateMigration( "MyNamespace", "MyMigration", new MigrationOperation[] { new SqlOperation { Sql = "-- TEST", ["Some:EnumValue"] = RegexOptions.Multiline }, new AlterColumnOperation { Name = "C2", Table = "T1", ClrType = typeof(Database), OldColumn = new ColumnOperation { ClrType = typeof(Property) } }, new AddColumnOperation { Name = "C3", Table = "T1", ClrType = typeof(PropertyEntry) } }, new MigrationOperation[0]); Assert.Equal( @"using System; using System.Collections.Generic; using System.Text.RegularExpressions; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage; namespace MyNamespace { public partial class MyMigration : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.Sql(""-- TEST"") .Annotation(""Some:EnumValue"", RegexOptions.Multiline); migrationBuilder.AlterColumn<Database>( name: ""C2"", table: ""T1"", nullable: false, oldClrType: typeof(Property)); migrationBuilder.AddColumn<PropertyEntry>( name: ""C3"", table: ""T1"", nullable: false); } protected override void Down(MigrationBuilder migrationBuilder) { } } } ", migrationCode, ignoreLineEndingDifferences: true); var migrationMetadataCode = generator.GenerateMetadata( "MyNamespace", typeof(MyContext), "MyMigration", "20150511161616_MyMigration", new Model { ["Some:EnumValue"] = RegexOptions.Multiline, ["Relational:DbFunction:MyFunc"] = new object() }); Assert.Equal( @"// <auto-generated /> using System; using System.Text.RegularExpressions; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations.Design; namespace MyNamespace { [DbContext(typeof(CSharpMigrationsGeneratorTest.MyContext))] [Migration(""20150511161616_MyMigration"")] partial class MyMigration { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation(""Some:EnumValue"", RegexOptions.Multiline); #pragma warning restore 612, 618 } } } ", migrationMetadataCode, ignoreLineEndingDifferences: true); var build = new BuildSource { References = { BuildReference.ByName("Microsoft.EntityFrameworkCore.Design.Tests"), BuildReference.ByName("Microsoft.EntityFrameworkCore"), BuildReference.ByName("Microsoft.EntityFrameworkCore.Relational") }, Sources = { migrationCode, migrationMetadataCode } }; var assembly = build.BuildInMemory(); var migrationType = assembly.GetType("MyNamespace.MyMigration", throwOnError: true, ignoreCase: false); var contextTypeAttribute = migrationType.GetTypeInfo().GetCustomAttribute <DbContextAttribute>(); Assert.NotNull(contextTypeAttribute); Assert.Equal(typeof(MyContext), contextTypeAttribute.ContextType); var migration = (Migration)Activator.CreateInstance(migrationType); Assert.Equal("20150511161616_MyMigration", migration.GetId()); Assert.Equal(3, migration.UpOperations.Count); Assert.Empty(migration.DownOperations); Assert.Empty(migration.TargetModel.GetEntityTypes()); }
public void Snapshot_with_default_values_are_round_tripped() { var codeHelper = new CSharpHelper(); var generator = new CSharpMigrationsGenerator( new MigrationsCodeGeneratorDependencies(), new CSharpMigrationsGeneratorDependencies( codeHelper, new CSharpMigrationOperationGenerator( new CSharpMigrationOperationGeneratorDependencies(codeHelper)), new CSharpSnapshotGenerator(new CSharpSnapshotGeneratorDependencies(codeHelper)))); var modelBuilder = new ModelBuilder(TestServiceFactory.Instance.Create <CoreConventionSetBuilder>().CreateConventionSet()); modelBuilder.Entity <EntityWithEveryPrimitive>( eb => { eb.Property(e => e.Boolean).HasDefaultValue(false); eb.Property(e => e.Byte).HasDefaultValue((byte)0); eb.Property(e => e.ByteArray).HasDefaultValue(new byte[] { 0 }); eb.Property(e => e.Char).HasDefaultValue('0'); eb.Property(e => e.DateTime).HasDefaultValue(new DateTime(1980, 1, 1)); eb.Property(e => e.DateTimeOffset).HasDefaultValue(new DateTimeOffset(1980, 1, 1, 0, 0, 0, new TimeSpan(0, 0, 0))); eb.Property(e => e.Decimal).HasDefaultValue(0m); eb.Property(e => e.Double).HasDefaultValue(0.0); eb.Property(e => e.Enum).HasDefaultValue(Enum1.Default); eb.Property(e => e.Guid).HasDefaultValue(new Guid()); eb.Property(e => e.Int16).HasDefaultValue((short)0); eb.Property(e => e.Int32).HasDefaultValue(0); eb.Property(e => e.Int64).HasDefaultValue(0L); eb.Property(e => e.Single).HasDefaultValue((float)0.0); eb.Property(e => e.SByte).HasDefaultValue((sbyte)0); eb.Property(e => e.String).HasDefaultValue("'\"'"); eb.Property(e => e.TimeSpan).HasDefaultValue(new TimeSpan(0, 0, 0)); eb.Property(e => e.UInt16).HasDefaultValue((ushort)0); eb.Property(e => e.UInt32).HasDefaultValue(0U); eb.Property(e => e.UInt64).HasDefaultValue(0UL); eb.Property(e => e.NullableBoolean).HasDefaultValue(true); eb.Property(e => e.NullableByte).HasDefaultValue(byte.MaxValue); eb.Property(e => e.NullableChar).HasDefaultValue('\''); eb.Property(e => e.NullableDateTime).HasDefaultValue(new DateTime(1900, 12, 31)); eb.Property(e => e.NullableDateTimeOffset).HasDefaultValue(new DateTimeOffset(3000, 1, 1, 0, 0, 0, new TimeSpan(0, 0, 0))); eb.Property(e => e.NullableDecimal).HasDefaultValue(2m * long.MaxValue); eb.Property(e => e.NullableDouble).HasDefaultValue(0.6822871999174); eb.Property(e => e.NullableEnum).HasDefaultValue(Enum1.Default); eb.Property(e => e.NullableGuid).HasDefaultValue(new Guid()); eb.Property(e => e.NullableInt16).HasDefaultValue(short.MinValue); eb.Property(e => e.NullableInt32).HasDefaultValue(int.MinValue); eb.Property(e => e.NullableInt64).HasDefaultValue(long.MinValue); eb.Property(e => e.NullableSingle).HasDefaultValue(0.3333333f); eb.Property(e => e.NullableSByte).HasDefaultValue(sbyte.MinValue); eb.Property(e => e.NullableTimeSpan).HasDefaultValue(new TimeSpan(-1, 0, 0)); eb.Property(e => e.NullableUInt16).HasDefaultValue(ushort.MaxValue); eb.Property(e => e.NullableUInt32).HasDefaultValue(uint.MaxValue); eb.Property(e => e.NullableUInt64).HasDefaultValue(ulong.MaxValue); }); var modelSnapshotCode = generator.GenerateSnapshot( "MyNamespace", typeof(MyContext), "MySnapshot", modelBuilder.Model); var snapshot = CompileModelSnapshot(modelSnapshotCode, "MyNamespace.MySnapshot"); var entityType = snapshot.Model.GetEntityTypes().Single(); Assert.Equal(typeof(EntityWithEveryPrimitive).FullName, entityType.DisplayName()); foreach (var property in modelBuilder.Model.GetEntityTypes().Single().GetProperties()) { var snapshotProperty = entityType.FindProperty(property.Name); Assert.Equal(property.Relational().DefaultValue, snapshotProperty.Relational().DefaultValue); } }
public void Snapshots_compile() { var codeHelper = new CSharpHelper(); var generator = new CSharpMigrationsGenerator( new MigrationsCodeGeneratorDependencies(), new CSharpMigrationsGeneratorDependencies( codeHelper, new CSharpMigrationOperationGenerator( new CSharpMigrationOperationGeneratorDependencies(codeHelper)), new CSharpSnapshotGenerator(new CSharpSnapshotGeneratorDependencies(codeHelper)))); var model = new Model { ["Some:EnumValue"] = RegexOptions.Multiline, ["Relational:DbFunction:MyFunc"] = new object() }; var entityType = model.AddEntityType("Cheese"); entityType.AddProperty("Pickle", typeof(StringBuilder)); var modelSnapshotCode = generator.GenerateSnapshot( "MyNamespace", typeof(MyContext), "MySnapshot", model); Assert.Equal( @"// <auto-generated /> using System; using System.Text; using System.Text.RegularExpressions; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations.Design; namespace MyNamespace { [DbContext(typeof(CSharpMigrationsGeneratorTest.MyContext))] partial class MySnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation(""Some:EnumValue"", RegexOptions.Multiline); modelBuilder.Entity(""Cheese"", b => { b.Property<StringBuilder>(""Pickle""); b.ToTable(""Cheese""); }); #pragma warning restore 612, 618 } } } ", modelSnapshotCode, ignoreLineEndingDifferences: true); var snapshot = CompileModelSnapshot(modelSnapshotCode, "MyNamespace.MySnapshot"); Assert.Equal(1, snapshot.Model.GetEntityTypes().Count()); }
public CSharpMigrationOperationGenerator([NotNull] CSharpHelper codeHelper) { Check.NotNull(codeHelper, nameof(codeHelper)); _code = codeHelper; }
public void Literal_works(object value, string expected) { var literal = new CSharpHelper().UnknownLiteral(value); Assert.Equal(expected, literal); }
public void Literal_works_when_many_StringArray() { var literal = new CSharpHelper().Literal(new[] { "A", "B" }); Assert.Equal("new[] { \"A\", \"B\" }", literal); }
public void Literal_works_when_single_StringArray() { var literal = new CSharpHelper().Literal(new[] { "A" }); Assert.Equal("\"A\"", literal); }
public CSharpSnapshotGenerator([NotNull] CSharpHelper codeHelper) { Check.NotNull(codeHelper, nameof(codeHelper)); _code = codeHelper; }