protected string WriteMigration( ScaffoldedMigration scaffoldedMigration, bool rescaffolding = false, bool force = false, string name = null) { DebugCheck.NotNull(scaffoldedMigration); var userCodeFileName = scaffoldedMigration.MigrationId + "." + scaffoldedMigration.Language; var userCodePath = Path.Combine(scaffoldedMigration.Directory, userCodeFileName); var absoluteUserCodePath = Path.Combine(ProjectDir.Value(), userCodePath); var designerCodeFileName = scaffoldedMigration.MigrationId + ".Designer." + scaffoldedMigration.Language; var designerCodePath = Path.Combine(scaffoldedMigration.Directory, designerCodeFileName); var absoluteDesignerCodePath = Path.Combine(ProjectDir.Value(), designerCodePath); var resourcesFileName = scaffoldedMigration.MigrationId + ".resx"; var resourcesPath = Path.Combine(scaffoldedMigration.Directory, resourcesFileName); if (rescaffolding && !force) { if (!string.Equals(scaffoldedMigration.UserCode, File.ReadAllText(absoluteUserCodePath))) { Debug.Assert(!string.IsNullOrWhiteSpace(name)); Reporter.WriteWarning(string.Format(MyResources.RescaffoldNoForce, name)); } } else { Directory.CreateDirectory(Path.GetDirectoryName(absoluteUserCodePath)); File.WriteAllText(absoluteUserCodePath, scaffoldedMigration.UserCode, Encoding.UTF8); } var absoluteResourcesPath = Path.Combine(ProjectDir.Value(), resourcesPath); using (var writer = new ResXResourceWriter(absoluteResourcesPath)) { foreach (var i in scaffoldedMigration.Resources) { writer.AddResource(i.Key, i.Value); } } Directory.CreateDirectory(Path.GetDirectoryName(absoluteDesignerCodePath)); File.WriteAllText(absoluteDesignerCodePath, scaffoldedMigration.DesignerCode, Encoding.UTF8); return(userCodePath); }
protected override int Execute() { var migrationsDirectory = _migrationsDir.Value(); var qualifiedContextTypeName = CreateExecutor().GetContextType( _context.Value(), _contextAssembly.Value()); var isVb = string.Equals(Language.Value(), "VB", StringComparison.OrdinalIgnoreCase); var fileName = isVb ? "Configuration.vb" : "Configuration.cs"; var templateStream = typeof(MigrationsEnableCommand).Assembly.GetManifestResourceStream("System.Data.Entity.Tools.Templates." + fileName); Debug.Assert(templateStream != null); string template; using (var templateReader = new StreamReader(templateStream, Encoding.UTF8)) { template = templateReader.ReadToEnd(); } var tokens = new Dictionary <string, string>(); if (!string.IsNullOrWhiteSpace(migrationsDirectory)) { tokens["migrationsDirectory"] = "\r\n MigrationsDirectory = " + (!isVb ? "@" : null) + "\"" + migrationsDirectory + "\"" + (!isVb ? ";" : null); } else { migrationsDirectory = "Migrations"; } tokens["enableAutomaticMigrations"] = _auto.HasValue() ? (isVb ? "True" : "true") : (isVb ? "False" : "false"); var rootNamespace = RootNamespace.Value(); var migrationsNamespace = migrationsDirectory.Replace("\\", "."); tokens["namespace"] = !isVb && !string.IsNullOrWhiteSpace(rootNamespace) ? rootNamespace + "." + migrationsNamespace : migrationsNamespace; if (isVb && qualifiedContextTypeName.StartsWith(rootNamespace + ".")) { tokens["contextType"] = qualifiedContextTypeName.Substring(rootNamespace.Length + 1).Replace('+', '.'); } else { tokens["contextType"] = qualifiedContextTypeName.Replace('+', '.'); } if (Path.IsPathRooted(migrationsDirectory)) { throw new CommandException(string.Format(MyResources.MigrationsDirectoryParamIsRooted, migrationsDirectory)); } var absoluteMigrationsDirectory = Path.Combine(ProjectDir.Value(), migrationsDirectory); var absolutePath = Path.Combine(absoluteMigrationsDirectory, fileName); if (!_force.HasValue() && File.Exists(absolutePath)) { throw new CommandException(string.Format(MyResources.MigrationsAlreadyEnabled, Assembly.Value())); } var fullMigrationsNamespace = rootNamespace + "." + migrationsNamespace; Reporter.WriteInformation(MyResources.EnableMigrations_BeginInitialScaffold); var scaffoldedMigration = CreateExecutor().ScaffoldInitialCreate( ConnectionStringName.Value(), ConnectionString.Value(), ConnectionProvider.Value(), qualifiedContextTypeName, _contextAssembly.Value(), fullMigrationsNamespace, _auto.HasValue(), migrationsDirectory); if (scaffoldedMigration != null) { if (!_auto.HasValue()) { WriteMigration(scaffoldedMigration); Reporter.WriteWarning(string.Format( MyResources.EnableMigrations_InitialScaffold, scaffoldedMigration.MigrationId)); } // We found an initial create so we need to add an explicit ContextKey // assignment to the configuration tokens["contextKey"] = "\r\n ContextKey = " + "\"" + qualifiedContextTypeName + "\"" + (!isVb ? ";" : null); } Directory.CreateDirectory(absoluteMigrationsDirectory); File.WriteAllText(absolutePath, new TemplateProcessor().Process(template, tokens), Encoding.UTF8); if (_json.HasValue()) { string migrationPath = null; string migrationDesignerPath = null; string migrationResourcesPath = null; if (scaffoldedMigration != null) { migrationPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + "." + scaffoldedMigration.Language); migrationDesignerPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + ".resx"); migrationResourcesPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + ".Designer." + scaffoldedMigration.Language); } Reporter.WriteData("{"); Reporter.WriteData(" \"migrationsConfiguration\": " + Json.Literal(absolutePath) + ","); Reporter.WriteData(" \"migration\": " + Json.Literal(migrationPath) + ","); Reporter.WriteData(" \"migrationResources\": " + Json.Literal(migrationDesignerPath) + ","); Reporter.WriteData(" \"migrationDesigner\": " + Json.Literal(migrationResourcesPath)); Reporter.WriteData("}"); } return(base.Execute()); }
protected override int Execute() { var scaffoldedMigration = CreateExecutor().Scaffold( _name.Value, ConnectionStringName.Value(), ConnectionString.Value(), ConnectionProvider.Value(), MigrationsConfig.Value(), _ignoreChanges.HasValue()); Reporter.WriteInformation( string.Format( !scaffoldedMigration.IsRescaffold ? MyResources.ScaffoldingMigration : MyResources.RescaffoldingMigration, _name.Value)); var userCodePath = WriteMigration(scaffoldedMigration, scaffoldedMigration.IsRescaffold, _force.HasValue(), _name.Value); if (!scaffoldedMigration.IsRescaffold) { Reporter.WriteWarning(string.Format(MyResources.SnapshotBehindWarning, _name.Value)); var databaseMigrations = CreateExecutor().GetDatabaseMigrations( ConnectionStringName.Value(), ConnectionString.Value(), ConnectionProvider.Value(), MigrationsConfig.Value()) .Take(2).ToList(); var lastDatabaseMigration = databaseMigrations.FirstOrDefault(); if ((lastDatabaseMigration != null) && string.Equals(lastDatabaseMigration.MigrationName(), _name.Value, StringComparison.Ordinal)) { var revertTargetMigration = databaseMigrations.ElementAtOrDefault(1); Reporter.WriteWarning( string.Format( MyResources.DidYouMeanToRescaffold, _name.Value, revertTargetMigration ?? "$InitialDatabase", Path.GetFileName(userCodePath))); } } if (_json.HasValue()) { string migrationPath = null; string migrationDesignerPath = null; string migrationResourcesPath = null; if (scaffoldedMigration != null) { var absoluteMigrationsDirectory = Path.Combine(ProjectDir.Value(), scaffoldedMigration.Directory); migrationPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + "." + scaffoldedMigration.Language); migrationDesignerPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + ".resx"); migrationResourcesPath = Path.Combine( absoluteMigrationsDirectory, scaffoldedMigration.MigrationId + ".Designer." + scaffoldedMigration.Language); } Reporter.WriteData("{"); Reporter.WriteData(" \"migration\": " + Json.Literal(migrationPath) + ","); Reporter.WriteData(" \"migrationResources\": " + Json.Literal(migrationDesignerPath) + ","); Reporter.WriteData(" \"migrationDesigner\": " + Json.Literal(migrationResourcesPath)); Reporter.WriteData("}"); } return(base.Execute()); }