Example #1
0
        public void Use_With_Dependency_Injection()
        {
            // Register with SQL LocalDB services
            var services = new ServiceCollection()
                           .AddLogging((builder) => builder.AddXUnit(OutputHelper))
                           .AddSqlLocalDB();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            using (IServiceScope scope = serviceProvider.CreateScope())
            {
                ISqlLocalDbApi             localDB  = scope.ServiceProvider.GetService <ISqlLocalDbApi>();
                ISqlLocalDbInstanceInfo    instance = localDB.GetDefaultInstance();
                ISqlLocalDbInstanceManager manager  = instance.Manage();

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

                using (SqlConnection connection = instance.CreateConnection())
                {
                    connection.Open();

                    // Use the SQL connection...
                }
            }
        }
Example #2
0
 public SqlLocalDb()
 {
     _localDb  = new SqlLocalDbApi();
     _instance = _localDb.GetOrCreateInstance("SSS-LoadTests");
     _manager  = _instance.Manage();
     Initialize().Wait();
 }
        public async Task CreateConnection_Creates_A_Sql_Connection()
        {
            // Arrange
            using (var api = new SqlLocalDbApi(_loggerFactory))
            {
                using (TemporarySqlLocalDbInstance temporary = api.CreateTemporaryInstance(deleteFiles: true))
                {
                    ISqlLocalDbInstanceManager manager = temporary.Manage();

                    manager.ShouldNotBeNull();
                    manager.Name.ShouldBe(temporary.Name);

                    // Act
                    using (SqlConnection actual = manager.CreateConnection())
                    {
                        // Assert
                        actual.ShouldNotBeNull();
                        actual.ConnectionString.ShouldNotBeNull();
                        actual.State.ShouldBe(ConnectionState.Closed);

                        await actual.OpenAsync();

                        actual.Close();
                    }
                }
            }
        }
        public void CreateConnection_Throws_If_Manager_Is_Null()
        {
            // Arrange
            ISqlLocalDbInstanceManager manager = null;

            // Act and Assert
            Assert.Throws <ArgumentNullException>("manager", () => manager.CreateConnection());
        }
        public void Restart_Throws_If_Manager_Is_Null()
        {
            // Arrange
            ISqlLocalDbInstanceManager manager = null;

            // Act and Assert
            Assert.Throws <ArgumentNullException>("manager", () => manager.Restart());
        }
Example #6
0
    public void Dispose()
    {
        this.sqlLocalDbApi?.Dispose();

        this.sqlLocalDbApi = null;
        this.dbInstance    = null;
        this.manager       = null;
    }
        public DacpacDbFixture()
        {
            Console.WriteLine("Running fixture constructor...");

            _localDb = new SqlLocalDbApi();
            DateTime nowUtc = DateTime.UtcNow;

            LocalDbInstanceName = $"{nowUtc.ToString("yyyyMMddHHmmssFFFFFFF")}";    //something mostly unique
            _instance           = _localDb.GetOrCreateInstance(LocalDbInstanceName);
            _manager            = _instance.Manage();

            if (!_instance.IsRunning)
            {
                _manager.Start();
            }

            var packagePath = "SimpleDb.dacpac";

            var deployOptions = new DacDeployOptions
            {
                CreateNewDatabase     = true,
                GenerateSmartDefaults = true,
            };

            deployOptions.SqlCommandVariableValues["LoginName"] = DatabaseUserName;
            deployOptions.SqlCommandVariableValues["Password"]  = DatabasePassword;

            SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();

            csb.DataSource         = _manager.NamedPipe;
            csb.IntegratedSecurity = true;
            var databaseName          = "SimpleDbUnitTest";
            var debugConnectionString = csb.ConnectionString;
            var dacServices           = new DacServices(debugConnectionString);

            using (var package = DacPackage.Load(packagePath))
            {
                dacServices.Deploy(package, databaseName, true, deployOptions);
            }
            csb.InitialCatalog = databaseName;
            //csb.UserID = DatabaseUserName;
            //csb.Password = DatabasePassword;
            //csb.IntegratedSecurity = false;
            ConnectionString = csb.ConnectionString;

            EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
            string nameOfConnectionString      = "SimpleDbModel";         //NOTE: HACK: this must match the name of my Entity Framework model (the .edmx guy)
            string providerName = "System.Data.SqlClient";

            ecsb.Provider = providerName;
            ecsb.ProviderConnectionString = csb.ConnectionString;
            ecsb.Metadata      = $"res://*/{nameOfConnectionString}.csdl|res://*/{nameOfConnectionString}.ssdl|res://*/{nameOfConnectionString}.msl";
            EfConnectionString = ecsb.ConnectionString;

            NumberOfTimesDacpacWasApplied++;
            Debug.WriteLine($">> The DACPAC has been applied {NumberOfTimesDacpacWasApplied} times");
            Console.WriteLine($">> The DACPAC has been applied {NumberOfTimesDacpacWasApplied} times");
        }
Example #8
0
        /// <summary>
        /// Creates a connection to the LocalDB instance.
        /// </summary>
        /// <param name="manager">The <see cref="ISqlLocalDbInstanceManager"/> associated with the instance to create a connection to.</param>
        /// <returns>
        /// An instance of <see cref="SqlConnection"/> that can be used to connect to the LocalDB instance.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="manager"/> is <see langword="null"/>.
        /// </exception>
        public static SqlConnection CreateConnection(this ISqlLocalDbInstanceManager manager)
        {
            if (manager == null)
            {
                throw new ArgumentNullException(nameof(manager));
            }

            return(manager.GetInstanceInfo().CreateConnection());
        }
Example #9
0
        /// <summary>
        /// Restarts the specified <see cref="ISqlLocalDbInstanceManager"/> instance.
        /// </summary>
        /// <param name="manager">The <see cref="ISqlLocalDbInstanceManager"/> associated with the instance to restart.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="manager"/> is <see langword="null"/>.
        /// </exception>
        public static void Restart(this ISqlLocalDbInstanceManager manager)
        {
            if (manager == null)
            {
                throw new ArgumentNullException(nameof(manager));
            }

            manager.Stop();
            manager.Start();
        }
        private void StartLocalDbInstance()
        {
            bool creating = !this.localDbApi.InstanceExists(dbInstanceName);

            this.logger.LogTrace($"{(creating ? "Creating" : "Connecting to")} internal DB instance {dbInstanceName}");

            this.localDbInstance = this.localDbApi.CreateInstance(dbInstanceName);
            this.instanceManager = this.localDbInstance.Manage();

            if (!this.localDbInstance.IsRunning)
            {
                this.logger.LogTrace($"Starting internal DB instance {dbInstanceName}");
                this.instanceManager.Start();
            }

            var bbuilder = this.localDbInstance.CreateConnectionStringBuilder();

            bbuilder.InitialCatalog       = "master";
            bbuilder.ConnectTimeout       = 30;
            bbuilder.IntegratedSecurity   = true;
            this.masterDbConnectionString = bbuilder.ToString();

            this.logger.LogTrace($"Master DB connection string {this.masterDbConnectionString}");

            if (creating)
            {
                this.EnableContainment();
            }

            if (!this.IsDbAttached())
            {
                if (File.Exists(this.localDbPath))
                {
                    this.logger.LogTrace($"Attaching existing DB {this.localDbPath} to instance");
                    this.AttachExistingDb();
                }
                else
                {
                    this.logger.LogTrace($"Creating new DB {this.localDbPath} in instance");
                    this.CreateDb();
                }
            }
            else
            {
                this.logger.LogTrace($"Database was already attached to instance {dbInstanceName}");
            }

            bbuilder = this.localDbInstance.CreateConnectionStringBuilder();
            bbuilder.InitialCatalog     = "AccessManager";
            bbuilder.ConnectTimeout     = 30;
            bbuilder.IntegratedSecurity = true;
            this.ConnectionString       = bbuilder.ToString();

            this.logger.LogTrace($"AccessManager DB connection string {this.ConnectionString}");
        }
 public DatabaseFixture()
 {
     this.localDB = new SqlLocalDbApi();
     instance     = localDB.GetOrCreateInstance(DatabaseFixture.LOCALDB_NAME);
     manager      = instance.Manage();
     if (!instance.IsRunning)
     {
         manager.Start();
     }
     RestoreBackup().GetAwaiter().GetResult();
 }
Example #12
0
    public SqlServer()
    {
        this.sqlLocalDbApi = new SqlLocalDbApi();
        this.dbInstance    = this.sqlLocalDbApi.GetDefaultInstance();
        this.manager       = this.dbInstance.Manage();

        if (!this.dbInstance.IsRunning)
        {
            Normal("SqlServer: Start");
            this.manager.Start();
        }
    }
Example #13
0
        public void Restart_Stops_And_Starts_Instance()
        {
            // Arrange
            using var api = new SqlLocalDbApi(_loggerFactory);
            using TemporarySqlLocalDbInstance temporary = api.CreateTemporaryInstance(deleteFiles: true);

            ISqlLocalDbInstanceManager manager = temporary.Manage();

            // Act
            manager.Restart();

            // Assert
            temporary.GetInstanceInfo().IsRunning.ShouldBeTrue();
        }
Example #14
0
    public void Dispose()
    {
        try
        {
            this.manager.Stop();
        }
        catch { }

        this.sqlLocalDbApi?.Dispose();

        this.sqlLocalDbApi = null;
        this.dbInstance    = null;
        this.manager       = null;
    }
Example #15
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());
        }
Example #16
0
        public void Create_A_Sql_LocalDB_Instance()
        {
            using (var localDB = new SqlLocalDbApi(OutputHelper.ToLoggerFactory()))
            {
                ISqlLocalDbInstanceInfo    instance = localDB.GetOrCreateInstance("MyInstance");
                ISqlLocalDbInstanceManager manager  = instance.Manage();

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

                using (SqlConnection connection = instance.CreateConnection())
                {
                    connection.Open();

                    // Use the SQL connection...
                }

                manager.Stop();
            }
        }
        public static void Manage_Returns_An_ISqlLocalDbInstanceManager()
        {
            // Arrange
            var api  = Mock.Of <ISqlLocalDbApi>();
            var mock = new Mock <ISqlLocalDbInstanceInfo>();

            mock.As <ISqlLocalDbApiAdapter>()
            .Setup((p) => p.LocalDb).Returns(api);

            ISqlLocalDbInstanceInfo instance = mock.Object;

            // Act
            ISqlLocalDbInstanceManager actual = instance.Manage();

            // Assert
            actual.ShouldNotBeNull();

            var adapter = actual as ISqlLocalDbApiAdapter;

            adapter.ShouldNotBeNull();
            adapter.LocalDb.ShouldBeSameAs(api);
        }
Example #18
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);
            });
        }