diff --git a/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs b/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs index df01200da39..7542807cea0 100644 --- a/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs +++ b/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs @@ -55,7 +55,9 @@ public virtual void Generate(string builderName, IModel model, IndentedStringBui .FilterIgnoredAnnotations(model.GetAnnotations()) .ToDictionary(a => a.Name, a => a); - if (annotations.Count > 0) + var productVersion = model.GetProductVersion(); + + if (annotations.Count > 0 || productVersion != null) { stringBuilder.Append(builderName); @@ -69,7 +71,13 @@ public virtual void Generate(string builderName, IModel model, IndentedStringBui .Append(Code.Fragment(methodCallCodeFragment)); } - GenerateAnnotations(annotations.Values, stringBuilder); + IEnumerable remainingAnnotations = annotations.Values; + if (productVersion != null) + { + remainingAnnotations = remainingAnnotations.Append( + new Annotation(CoreAnnotationNames.ProductVersion, productVersion)); + } + GenerateAnnotations(remainingAnnotations, stringBuilder); } stringBuilder.AppendLine(";"); diff --git a/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs b/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs index 627c5287ec0..a1b199d620a 100644 --- a/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs +++ b/test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs @@ -533,6 +533,18 @@ public virtual void CheckConstraint_is_only_stored_in_snapshot_once_for_TPH() }); } + [ConditionalFact] + public virtual void ProductVersion_is_stored_in_snapshot() + { + var modelBuilder = CreateConventionalModelBuilder(); + var generator = CreateMigrationsGenerator(); + var code = generator.GenerateSnapshot("RootNamespace", typeof(DbContext), "Snapshot", modelBuilder.Model); + Assert.Contains(@".HasAnnotation(""ProductVersion"",", code); + + var modelFromSnapshot = BuildModelFromSnapshotSource(code); + Assert.Equal(ProductInfo.GetVersion(), modelFromSnapshot.GetProductVersion()); + } + #endregion #region EntityType @@ -3970,36 +3982,16 @@ protected void Test(IModel model, string expectedCode, Action assert) protected void Test(IModel model, string expectedCode, Action assert) { - var sqlServerTypeMappingSource = new SqlServerTypeMappingSource( - TestServiceFactory.Instance.Create(), - new RelationalTypeMappingSourceDependencies( - new IRelationalTypeMappingSourcePlugin[] - { - new SqlServerNetTopologySuiteTypeMappingSourcePlugin(NtsGeometryServices.Instance) - })); - - var codeHelper = new CSharpHelper( - sqlServerTypeMappingSource); - - var sqlServerAnnotationCodeGenerator = new SqlServerAnnotationCodeGenerator( - new AnnotationCodeGeneratorDependencies(sqlServerTypeMappingSource)); - - var generator = new CSharpMigrationsGenerator( - new MigrationsCodeGeneratorDependencies( - sqlServerTypeMappingSource, - sqlServerAnnotationCodeGenerator), - new CSharpMigrationsGeneratorDependencies( - codeHelper, - new CSharpMigrationOperationGenerator( - new CSharpMigrationOperationGeneratorDependencies( - codeHelper)), - new CSharpSnapshotGenerator( - new CSharpSnapshotGeneratorDependencies( - codeHelper, sqlServerTypeMappingSource, sqlServerAnnotationCodeGenerator)))); - + var generator = CreateMigrationsGenerator(); var code = generator.GenerateSnapshot("RootNamespace", typeof(DbContext), "Snapshot", model); Assert.Equal(expectedCode, code, ignoreLineEndingDifferences: true); + var modelFromSnapshot = BuildModelFromSnapshotSource(code); + assert(modelFromSnapshot, model); + } + + protected IModel BuildModelFromSnapshotSource(string code) + { var build = new BuildSource { Sources = { code } }; foreach (var buildReference in GetReferences()) @@ -4027,9 +4019,7 @@ protected void Test(IModel model, string expectedCode, Action as var services = RelationalTestHelpers.Instance.CreateContextServices(); var processor = new SnapshotModelProcessor(new TestOperationReporter(), services.GetService()); - var modelFromSnapshot = processor.Process(builder.Model); - - assert(modelFromSnapshot, model); + return processor.Process(builder.Model); } protected ModelBuilder CreateConventionalModelBuilder() @@ -4047,5 +4037,37 @@ protected ModelBuilder CreateConventionalModelBuilder() using var context = serviceScope.ServiceProvider.GetService(); return new ModelBuilder(ConventionSet.CreateConventionSet(context)); } + + protected CSharpMigrationsGenerator CreateMigrationsGenerator() + { + var sqlServerTypeMappingSource = new SqlServerTypeMappingSource( + TestServiceFactory.Instance.Create(), + new RelationalTypeMappingSourceDependencies( + new IRelationalTypeMappingSourcePlugin[] + { + new SqlServerNetTopologySuiteTypeMappingSourcePlugin(NtsGeometryServices.Instance) + })); + + var codeHelper = new CSharpHelper( + sqlServerTypeMappingSource); + + var sqlServerAnnotationCodeGenerator = new SqlServerAnnotationCodeGenerator( + new AnnotationCodeGeneratorDependencies(sqlServerTypeMappingSource)); + + var generator = new CSharpMigrationsGenerator( + new MigrationsCodeGeneratorDependencies( + sqlServerTypeMappingSource, + sqlServerAnnotationCodeGenerator), + new CSharpMigrationsGeneratorDependencies( + codeHelper, + new CSharpMigrationOperationGenerator( + new CSharpMigrationOperationGeneratorDependencies( + codeHelper)), + new CSharpSnapshotGenerator( + new CSharpSnapshotGeneratorDependencies( + codeHelper, sqlServerTypeMappingSource, sqlServerAnnotationCodeGenerator)))); + + return generator; + } } }