Пример #1
0
        private static void AddTodoContext(IServiceProvider serviceProvider, DbContextOptionsBuilder options)
        {
            // Check that SQL Server LocalDB is installed
            ISqlLocalDbApi localDB = serviceProvider.GetRequiredService <ISqlLocalDbApi>();

            if (!localDB.IsLocalDBInstalled())
            {
                throw new NotSupportedException("SQL LocalDB is not installed.");
            }

            // Get the configured SQL LocalDB instance to store the TODO items in, creating it if it does not exist
            IConfiguration          config   = serviceProvider.GetRequiredService <IConfiguration>();
            ISqlLocalDbInstanceInfo instance = localDB.GetOrCreateInstance(config["SqlLocalDbInstance"]);

            // Ensure that the SQL LocalDB instance is running and start it if not already running
            if (!instance.IsRunning)
            {
                instance.Manage().Start();
            }

            // Get the SQL connection string to use to connect to the LocalDB instance
            string connectionString = instance.GetConnectionString();

            options.UseSqlServer(connectionString);
        }
Пример #2
0
        public static string GetRunningConnectionString(ISqlLocalDbInstanceInfo db)
        {
            if (!db.IsRunning)
            {
                db.Manage().Start();
            }

            return(db.GetConnectionString());
        }
Пример #3
0
        private static string InitSqlLocalDB()
        {
            ISqlLocalDbApi          localDB  = new SqlLocalDbApi();
            ISqlLocalDbInstanceInfo instance = localDB.GetOrCreateInstance(@"localtestdb");

            ISqlLocalDbInstanceManager manager = instance.Manage();

            if (!instance.IsRunning)
            {
                manager.Start();
            }

            return(instance.GetConnectionString());
        }
        public static void GetConnectionString_Returns_Sql_Connection_String()
        {
            // Arrange
            var mock = new Mock <ISqlLocalDbInstanceInfo>();

            mock.Setup((p) => p.IsRunning).Returns(true);
            mock.Setup((p) => p.NamedPipe).Returns("MyNamedPipe");

            ISqlLocalDbInstanceInfo instance = mock.Object;

            // Act
            string actual = instance.GetConnectionString();

            // Assert
            actual.ShouldBe("Data Source=MyNamedPipe");
        }
Пример #5
0
        public static void RegisterAndPopulateLocalDatabase(this IServiceCollection services)
        {
            var options = new SqlLocalDbOptions()
            {
                AutomaticallyDeleteInstanceFiles = true,
                StopOptions = StopInstanceOptions.NoWait,
                StopTimeout = TimeSpan.FromDays(1),
            };

            services.AddSingleton(sp => new SqlLocalDbApi(options, sp.GetRequiredService <ILoggerFactory>()));
            services.AddSingleton(sp =>
            {
                ISqlLocalDbInstanceInfo instance = sp.GetRequiredService <SqlLocalDbApi>().GetOrCreateInstance("ProductSuggestions");

                if (!instance.IsRunning)
                {
                    ISqlLocalDbInstanceManager manager = instance.Manage();
                    manager.Start();
                }

                sp.GetRequiredService <ILogger <ISqlLocalDbInstanceInfo> >().LogInformation($"\nConnectionString:\n{instance.GetConnectionString()}");

                var upgrader = DeployChanges.To
                               .SqlDatabase(instance.GetConnectionString())
                               .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly())
                               .LogToConsole()
                               .Build();

                var result = upgrader.PerformUpgrade();

                if (!result.Successful)
                {
                    throw result.Error;
                }

                return(instance);
            });
        }
Пример #6
0
        public async Task RestoreBackup()
        {
            using (SqlConnection connection = new SqlConnection(instance.GetConnectionString()))
            {
                try
                {
                    await connection.OpenAsync();

                    var command           = connection.CreateCommand();
                    var DBPath            = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + Path.DirectorySeparatorChar;
                    var UserPath          = Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile) + Path.DirectorySeparatorChar;
                    var DatabaseBackupZip = DBPath + "Resources" + Path.DirectorySeparatorChar + DatabaseFixture.DATABASE_NAME + ".zip";
                    var DatabaseBackup    = DBPath + "Resources" + Path.DirectorySeparatorChar + DatabaseFixture.DATABASE_NAME + ".bak";

                    if (File.Exists(DatabaseBackup))
                    {
                        File.Delete(DatabaseBackup);
                    }
                    if (!File.Exists(DatabaseBackupZip))
                    {
                        throw new Exception("File " + DatabaseBackupZip + " does not exist.");
                    }
                    System.IO.Compression.ZipFile.ExtractToDirectory(DatabaseBackupZip, DBPath + "Resources" + Path.DirectorySeparatorChar);
                    if (!File.Exists(DatabaseBackup))
                    {
                        throw new Exception("File " + DatabaseBackup + " does not exist.");
                    }

                    if (File.Exists(string.Format("{0}{1}.mdf", UserPath, DatabaseFixture.DATABASE_NAME)))
                    {
                        File.Delete(string.Format("{0}{1}.mdf", UserPath, DatabaseFixture.DATABASE_NAME));
                    }
                    if (File.Exists(string.Format("{0}{1}.ldf", UserPath, DatabaseFixture.DATABASE_NAME)))
                    {
                        File.Delete(string.Format("{0}{1}.ldf", UserPath, DatabaseFixture.DATABASE_NAME));
                    }
                    command.CommandText    = string.Format(@"
USE [master]
DECLARE @NOTE VARCHAR(8000) = '';
SET @NOTE = 'Restoring Local DB'; RAISERROR (@NOTE, 10, 1) WITH NOWAIT; 

SET NOCOUNT ON;
DECLARE @PMSG VARCHAR(8000) = ''; DECLARE @PROC VARCHAR(512) = 'LocalDB Restore: ';
BEGIN TRY
	IF EXISTS (SELECT name FROM sys.databases WHERE name = N'{2}') BEGIN
		ALTER DATABASE [{2}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
		EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'{2}';
		SET @NOTE = 'Deleting old database'; RAISERROR (@NOTE, 10, 1) WITH NOWAIT; 
		DROP DATABASE [{2}]
	END
END TRY
BEGIN CATCH
END CATCH
DECLARE @MDF VARCHAR(512) = CONVERT(NVARCHAR, serverproperty('InstanceDefaultDataPath')) + '{2}.mdf';
DECLARE @LDF VARCHAR(512) = CONVERT(NVARCHAR, serverproperty('InstanceDefaultLogPath')) + '{2}.ldf';
BEGIN TRY
	DROP DATABASE [{2}]
END TRY
BEGIN CATCH
END CATCH

SET @NOTE = 'Restoring....'; RAISERROR (@NOTE, 10, 1) WITH NOWAIT; 
RESTORE DATABASE [{2}]
FROM DISK = '{0}'
WITH REPLACE,RECOVERY,
    MOVE '{2}' TO @MDF,
    MOVE '{2}_log' TO @LDF;
", DatabaseBackup, UserPath, DatabaseFixture.DATABASE_NAME).Replace(@"\", @"\\");
                    command.CommandTimeout = 300;
                    await command.ExecuteNonQueryAsync();
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
        }