示例#1
0
        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());
        }