From 7650a5fbc38b395df0eb7210c8411804e4835b58 Mon Sep 17 00:00:00 2001
From: mor0146 <vojtech.moravec.st@vsb.cz>
Date: Fri, 5 Oct 2018 13:42:17 +0200
Subject: [PATCH] Dynamic switching between samely structured databases.

---
 DataAccessTier/App.config                     |  84 ++++++-----
 DataAccessTier/DataAccessTier.csproj          |  11 +-
 DataAccessTier/MiddlewareContext.cs           | 138 ++++++++++--------
 DataAccessTier/Migrations/Configuration.cs    |   2 +-
 ...eIfNotExistOrMigrateDatabaseInitializer.cs |  34 +++++
 .../201711011130556_InitialCreate.Designer.cs |   0
 .../201711011130556_InitialCreate.cs          |   0
 .../201711011130556_InitialCreate.resx        |   0
 .../Properties/Settings.Designer.cs           |  14 +-
 DataAccessTier/Properties/Settings.settings   |   7 +-
 .../UnitOfWork/DatabaseUnitOfWork.cs          |  13 +-
 DomainObjects/Notifications/Language.cs       |   3 -
 HpcAsAServiceMiddleware.sln                   |  32 ++++
 MiddlewareTests/App.config                    |  20 +++
 MiddlewareTests/MiddlewareTests.csproj        |  88 +++++++++++
 MiddlewareTests/Properties/AssemblyInfo.cs    |  20 +++
 MiddlewareTests/UnitTest1.cs                  |  27 ++++
 MiddlewareTests/packages.config               |   6 +
 WebServices/WebServices.csproj.user           |   2 +-
 19 files changed, 375 insertions(+), 126 deletions(-)
 create mode 100644 DataAccessTier/Migrations/CreateIfNotExistOrMigrateDatabaseInitializer.cs
 rename DataAccessTier/Migrations/{ => initial_create_migration}/201711011130556_InitialCreate.Designer.cs (100%)
 rename DataAccessTier/Migrations/{ => initial_create_migration}/201711011130556_InitialCreate.cs (100%)
 rename DataAccessTier/Migrations/{ => initial_create_migration}/201711011130556_InitialCreate.resx (100%)
 create mode 100644 MiddlewareTests/App.config
 create mode 100644 MiddlewareTests/MiddlewareTests.csproj
 create mode 100644 MiddlewareTests/Properties/AssemblyInfo.cs
 create mode 100644 MiddlewareTests/UnitTest1.cs
 create mode 100644 MiddlewareTests/packages.config

diff --git a/DataAccessTier/App.config b/DataAccessTier/App.config
index 7e8f380..ce2fb39 100644
--- a/DataAccessTier/App.config
+++ b/DataAccessTier/App.config
@@ -1,52 +1,50 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <configuration>
-	<configSections>
+  <configSections>
 
-		<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
-		
-		<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-			<section name="HaaSMiddleware.DataAccessTier.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
-			<section name="DataAccessLayer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
-		</sectionGroup>
-	<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
-	<entityFramework>
-		<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
-		<providers>
-			<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
-		</providers>
-	</entityFramework>
+    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+
+    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+      <section name="HaaSMiddleware.DataAccessTier.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+      <section name="DataAccessLayer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+    </sectionGroup>
+    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+      <section name="HaaSMiddleware.DataAccessTier.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+    </sectionGroup>
+  </configSections>
+  <entityFramework>
+    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
+    <providers>
+      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+    </providers>
+  </entityFramework>
   <connectionStrings>
     <add name="HaaSMiddleware.DataAccessTier.Properties.Settings.MiddlewareContext"
-      connectionString="Data Source=DELLG5;Database=HaaS_Middleware;integrated security=True;"
+      connectionString="Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;"
       providerName="System.Data.SqlClient" />
   </connectionStrings>
-  <!--connectionString="Server=HAAS\SQLEXPRESS;Database=HaaS_Middleware_fiji;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Server=SVA162-NB\SQLEXPRESS;Database=HaaS_Middleware;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Server=HAAS\SQLEXPRESS;Database=HaaS_Middleware_Papcel;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Server=UTEPSTORAGE\SQLEXPRESS;Database=HaaS_Middleware;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Server=UTEPSTORAGE\SQLEXPRESS;Database=HaaS_Middleware_fiji;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Server=floreonwia.vsb.cz;Database=HaaS_Middleware;User Id=s_floreon;Password=Martinovicuv2Mazlik2015;"-->
-  <!--connectionString="Data Source=localhost;Initial Catalog=HaaS_Middleware;Trusted_Connection=SSPI"-->
-  <!--connectionString="Server=FLOREONWIA\SQLEXPRESS;Database=HaaS_Middleware;User Id=s_floreon;Password=Martinovicuv2Mazlik2015;"-->
-  <!--connectionString="Server=DHIRELEASE\SQLEXPRESSDHI;Database=HaaS_Middleware;User Id=haasuser;Password=haaspass;"-->
-  <!--connectionString="Data Source=195.113.250.27;Initial Catalog=HaaS_Middleware;Trusted_Connection=yes"-->
-	<!--Production: Data Source=localhost;Initial Catalog=HaaS_Middleware;Trusted_Connection=yes-->
-	<!--Development: Data Source=floreon2.cs.vsb.cz;Initial Catalog=HaaS_Middleware;User ID=s_floreon;Password=Martinovicuv2Mazlik2015;MultipleActiveResultSets=True-->
-	<!--Entity Framework Migrations: Data Source=195.113.250.18;Initial Catalog=HaaS_Middleware;Trusted_Connection=yes-->
-	<startup>
-		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
-	</startup>
-	<applicationSettings>
-		<HaaSMiddleware.DataAccessTier.Properties.Settings>
-   <setting name="DatabaseRepositoryType" serializeAs="String">
-    <value>LinqToEntities</value>
-   </setting>
-  </HaaSMiddleware.DataAccessTier.Properties.Settings>
-		<DataAccessLayer.Properties.Settings>
-			<setting name="RepositoryType" serializeAs="String">
-				<value>LinqToEntities</value>
-			</setting>
-		</DataAccessLayer.Properties.Settings>
-	</applicationSettings>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
+  </startup>
+  <applicationSettings>
+    <HaaSMiddleware.DataAccessTier.Properties.Settings>
+      <setting name="DatabaseRepositoryType" serializeAs="String">
+        <value>LinqToEntities</value>
+      </setting>
+    </HaaSMiddleware.DataAccessTier.Properties.Settings>
+    <DataAccessLayer.Properties.Settings>
+      <setting name="RepositoryType" serializeAs="String">
+        <value>LinqToEntities</value>
+      </setting>
+    </DataAccessLayer.Properties.Settings>
+  </applicationSettings>
+  <userSettings>
+    <HaaSMiddleware.DataAccessTier.Properties.Settings>
+      <setting name="CustomMiddlewareContext" serializeAs="String">
+        <value>Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;</value>
+      </setting>
+    </HaaSMiddleware.DataAccessTier.Properties.Settings>
+  </userSettings>
 </configuration>
\ No newline at end of file
diff --git a/DataAccessTier/DataAccessTier.csproj b/DataAccessTier/DataAccessTier.csproj
index 5a176eb..826c769 100644
--- a/DataAccessTier/DataAccessTier.csproj
+++ b/DataAccessTier/DataAccessTier.csproj
@@ -50,6 +50,7 @@
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.configuration" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
     <Reference Include="System.Xml.Linq" />
   </ItemGroup>
   <ItemGroup>
@@ -59,11 +60,8 @@
     <Compile Include="Factory\UnitOfWork\UnitOfWorkFactory.cs" />
     <Compile Include="Factory\UnitOfWork\DatabaseUnitOfWorkFactory.cs" />
     <Compile Include="Factory\UnitOfWork\UnitOfWorkType.cs" />
-    <Compile Include="Migrations\201711011130556_InitialCreate.cs" />
-    <Compile Include="Migrations\201711011130556_InitialCreate.Designer.cs">
-      <DependentUpon>201711011130556_InitialCreate.cs</DependentUpon>
-    </Compile>
     <Compile Include="Migrations\Configuration.cs" />
+    <Compile Include="Migrations\CreateIfNotExistOrMigrateDatabaseInitializer.cs" />
     <Compile Include="Properties\Settings.Designer.cs">
       <AutoGen>True</AutoGen>
       <DesignTimeSharedInput>True</DesignTimeSharedInput>
@@ -125,11 +123,6 @@
       <Name>DomainObjects</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="Migrations\201711011130556_InitialCreate.resx">
-      <DependentUpon>201711011130556_InitialCreate.cs</DependentUpon>
-    </EmbeddedResource>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/DataAccessTier/MiddlewareContext.cs b/DataAccessTier/MiddlewareContext.cs
index 8c6f6c1..25c394d 100644
--- a/DataAccessTier/MiddlewareContext.cs
+++ b/DataAccessTier/MiddlewareContext.cs
@@ -1,6 +1,10 @@
 
+using System;
+using System.Data.Common;
 using System.Data.Entity;
+using System.Data.Entity.Core.EntityClient;
 using System.Data.Entity.Migrations;
+using System.Data.SqlClient;
 using HaaSMiddleware.DataAccessTier.Migrations;
 using HaaSMiddleware.DomainObjects.AdminUserManagement;
 using HaaSMiddleware.DomainObjects.ClusterInformation;
@@ -10,80 +14,86 @@ using HaaSMiddleware.DomainObjects.JobManagement.JobInformation;
 using HaaSMiddleware.DomainObjects.Notifications;
 using HaaSMiddleware.DomainObjects.UserAndLimitationManagement;
 
-namespace HaaSMiddleware.DataAccessTier {
+namespace HaaSMiddleware.DataAccessTier
+{
+
+    internal class MiddlewareContext : DbContext
+    {
+        public MiddlewareContext() : base(Properties.Settings.Default.CustomMiddlewareContext)
+        {
+            //"name=MiddlewareContext") {
 
-    internal class MiddlewareContext : DbContext {
-		public MiddlewareContext()
-			: base(DataAccessTier.Properties.Settings.Default.MiddlewareContext) { //"name=MiddlewareContext") {
             //Database.SetInitializer(new CreateDatabaseIfNotExists<MiddlewareContext>());
-            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MiddlewareContext, Configuration>());
+            //Database.SetInitializer(new MigrateDatabaseToLatestVersion<MiddlewareContext, Configuration>());
+            Database.SetInitializer(new CreateIfNotExistOrMigrateDatabaseInitializer<MiddlewareContext, Configuration>());
         }
 
-		protected override void OnModelCreating(DbModelBuilder modelBuilder) {
-			base.OnModelCreating(modelBuilder);
+        protected override void OnModelCreating(DbModelBuilder modelBuilder)
+        {
+            base.OnModelCreating(modelBuilder);
 
-            string dbNamespace = System.Configuration.ConfigurationManager.AppSettings.Get("dbNamespace");
+            //string dbNamespace = System.Configuration.ConfigurationManager.AppSettings.Get("dbNamespace");
+            //modelBuilder.HasDefaultSchema(dbNamespace);
 
-            modelBuilder.HasDefaultSchema(dbNamespace);
 
-			// Set default schema
-			//modelBuilder.HasDefaultSchema("HaaS_Middleware");
+            // Set default schema
+            //modelBuilder.HasDefaultSchema("HaaS_Middleware");
             //modelBuilder.HasDefaultSchema("HaaS_Middleware_Test");
             //modelBuilder.HasDefaultSchema("HaaS_Middleware_fiji");
             //modelBuilder.HasDefaultSchema("HaaS_Middleware_DHI");
             //modelBuilder.HasDefaultSchema("HaaS_Middleware_Papcel");
 
-			// Separate JobTemplate and JobDescription
-			// into different tables
-			modelBuilder.Entity<JobSpecification>().ToTable("JobSpecification");
-			modelBuilder.Entity<JobTemplate>().ToTable("JobTemplate");
-		}
-
-		#region AdminUserManagement Entities
-		public virtual DbSet<AdministrationRole> AdministrationRoles { get; set; }
-		public virtual DbSet<AdministrationUser> AdministrationUsers { get; set; }
-		#endregion
-
-		#region ClusterInformation Entities
-		public virtual DbSet<Cluster> Clusters { get; set; }
-		public virtual DbSet<ClusterAuthenticationCredentials> ClusterAuthenticationCredentials { get; set; }
-		public virtual DbSet<ClusterNodeType> ClusterNodeTypes { get; set; }
-		#endregion
-
-		#region FileTransfer Entities
-		public virtual DbSet<FileSpecification> FileSpecifications { get; set; }
-		public virtual DbSet<FileTransferMethod> FileTransferMethods { get; set; }
-		#endregion
-
-		#region JobManagement.JobInformation Entities
-		public virtual DbSet<SubmittedJobInfo> SubmittedJobInfos { get; set; }
-		public virtual DbSet<SubmittedTaskInfo> SubmittedTaskInfos { get; set; }
-		#endregion
-
-		#region JobManagement Entities
-		public virtual DbSet<CommandTemplate> CommandTemplates { get; set; }
-		public virtual DbSet<CommandTemplateParameter> CommandTemplateParameters { get; set; }
-		public virtual DbSet<CommandTemplateParameterValue> CommandTemplateParameterValues { get; set; }
-		public virtual DbSet<EnvironmentVariable> EnvironmentVariables { get; set; }
-		public virtual DbSet<JobSpecification> JobSpecifications { get; set; }
-		public virtual DbSet<JobTemplate> JobTemplates { get; set; }
-		public virtual DbSet<PropertyChangeSpecification> PropertyChangeSpecifications { get; set; }
-		public virtual DbSet<TaskSpecification> TaskSpecifications { get; set; }
-		#endregion
-
-		#region Notifications Entities
-		public virtual DbSet<Language> Languages { get; set; }
-		public virtual DbSet<MessageLocalization> MessageLocalizations { get; set; }
-		public virtual DbSet<MessageTemplate> MessageTemplates { get; set; }
-		public virtual DbSet<MessageTemplateParameter> MessageTemplateParameters { get; set; }
-		public virtual DbSet<Notification> Notifications { get; set; }
-		#endregion
-
-		#region UserAndLimitationManagement Entities
-		public virtual DbSet<AdaptorUser> AdaptorUsers { get; set; }
-		public virtual DbSet<AdaptorUserGroup> AdaptorUserGroups { get; set; }
-		public virtual DbSet<ResourceLimitation> ResourceLimitations { get; set; }
-		public virtual DbSet<SessionCode> SessionCodes { get; set; }
-		#endregion
-	}
+            // Separate JobTemplate and JobDescription
+            // into different tables
+            modelBuilder.Entity<JobSpecification>().ToTable("JobSpecification");
+            modelBuilder.Entity<JobTemplate>().ToTable("JobTemplate");
+        }
+
+        #region AdminUserManagement Entities
+        public virtual DbSet<AdministrationRole> AdministrationRoles { get; set; }
+        public virtual DbSet<AdministrationUser> AdministrationUsers { get; set; }
+        #endregion
+
+        #region ClusterInformation Entities
+        public virtual DbSet<Cluster> Clusters { get; set; }
+        public virtual DbSet<ClusterAuthenticationCredentials> ClusterAuthenticationCredentials { get; set; }
+        public virtual DbSet<ClusterNodeType> ClusterNodeTypes { get; set; }
+        #endregion
+
+        #region FileTransfer Entities
+        public virtual DbSet<FileSpecification> FileSpecifications { get; set; }
+        public virtual DbSet<FileTransferMethod> FileTransferMethods { get; set; }
+        #endregion
+
+        #region JobManagement.JobInformation Entities
+        public virtual DbSet<SubmittedJobInfo> SubmittedJobInfos { get; set; }
+        public virtual DbSet<SubmittedTaskInfo> SubmittedTaskInfos { get; set; }
+        #endregion
+
+        #region JobManagement Entities
+        public virtual DbSet<CommandTemplate> CommandTemplates { get; set; }
+        public virtual DbSet<CommandTemplateParameter> CommandTemplateParameters { get; set; }
+        public virtual DbSet<CommandTemplateParameterValue> CommandTemplateParameterValues { get; set; }
+        public virtual DbSet<EnvironmentVariable> EnvironmentVariables { get; set; }
+        public virtual DbSet<JobSpecification> JobSpecifications { get; set; }
+        public virtual DbSet<JobTemplate> JobTemplates { get; set; }
+        public virtual DbSet<PropertyChangeSpecification> PropertyChangeSpecifications { get; set; }
+        public virtual DbSet<TaskSpecification> TaskSpecifications { get; set; }
+        #endregion
+
+        #region Notifications Entities
+        public virtual DbSet<Language> Languages { get; set; }
+        public virtual DbSet<MessageLocalization> MessageLocalizations { get; set; }
+        public virtual DbSet<MessageTemplate> MessageTemplates { get; set; }
+        public virtual DbSet<MessageTemplateParameter> MessageTemplateParameters { get; set; }
+        public virtual DbSet<Notification> Notifications { get; set; }
+        #endregion
+
+        #region UserAndLimitationManagement Entities
+        public virtual DbSet<AdaptorUser> AdaptorUsers { get; set; }
+        public virtual DbSet<AdaptorUserGroup> AdaptorUserGroups { get; set; }
+        public virtual DbSet<ResourceLimitation> ResourceLimitations { get; set; }
+        public virtual DbSet<SessionCode> SessionCodes { get; set; }
+        #endregion
+    }
 }
\ No newline at end of file
diff --git a/DataAccessTier/Migrations/Configuration.cs b/DataAccessTier/Migrations/Configuration.cs
index 5b4a83f..1c31b31 100644
--- a/DataAccessTier/Migrations/Configuration.cs
+++ b/DataAccessTier/Migrations/Configuration.cs
@@ -12,7 +12,7 @@ namespace HaaSMiddleware.DataAccessTier.Migrations
         public Configuration()
         {
             AutomaticMigrationsEnabled = true;
-            AutomaticMigrationDataLossAllowed = true;
+            AutomaticMigrationDataLossAllowed = true;   
         }
 
         protected override void Seed(HaaSMiddleware.DataAccessTier.MiddlewareContext context)
diff --git a/DataAccessTier/Migrations/CreateIfNotExistOrMigrateDatabaseInitializer.cs b/DataAccessTier/Migrations/CreateIfNotExistOrMigrateDatabaseInitializer.cs
new file mode 100644
index 0000000..37ed080
--- /dev/null
+++ b/DataAccessTier/Migrations/CreateIfNotExistOrMigrateDatabaseInitializer.cs
@@ -0,0 +1,34 @@
+using System.Data.Entity;
+using System.Data.Entity.Migrations;
+
+namespace HaaSMiddleware.DataAccessTier.Migrations
+{
+    internal class CreateIfNotExistOrMigrateDatabaseInitializer<TContext, TConfiguration> : CreateDatabaseIfNotExists<TContext>, IDatabaseInitializer<TContext>
+        where TContext : DbContext
+        where TConfiguration : DbMigrationsConfiguration<TContext>, new()
+    {
+        private readonly DbMigrationsConfiguration _migrationConfiguration;
+        internal CreateIfNotExistOrMigrateDatabaseInitializer()
+        {
+            _migrationConfiguration = new TConfiguration();
+        }
+
+        void IDatabaseInitializer<TContext>.InitializeDatabase(TContext context)
+        {
+            bool createDatabase = !context.Database.Exists();
+
+            var migrator = new DbMigrator(_migrationConfiguration);
+
+            //if (migrator.GetPendingMigrations().Any())
+            migrator.Update();
+            
+            base.InitializeDatabase(context);
+
+            if (createDatabase)
+            {
+                Seed(context);
+                context.SaveChanges();
+            }
+        }
+    }
+}
diff --git a/DataAccessTier/Migrations/201711011130556_InitialCreate.Designer.cs b/DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.Designer.cs
similarity index 100%
rename from DataAccessTier/Migrations/201711011130556_InitialCreate.Designer.cs
rename to DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.Designer.cs
diff --git a/DataAccessTier/Migrations/201711011130556_InitialCreate.cs b/DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.cs
similarity index 100%
rename from DataAccessTier/Migrations/201711011130556_InitialCreate.cs
rename to DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.cs
diff --git a/DataAccessTier/Migrations/201711011130556_InitialCreate.resx b/DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.resx
similarity index 100%
rename from DataAccessTier/Migrations/201711011130556_InitialCreate.resx
rename to DataAccessTier/Migrations/initial_create_migration/201711011130556_InitialCreate.resx
diff --git a/DataAccessTier/Properties/Settings.Designer.cs b/DataAccessTier/Properties/Settings.Designer.cs
index 136b2a5..47469f2 100644
--- a/DataAccessTier/Properties/Settings.Designer.cs
+++ b/DataAccessTier/Properties/Settings.Designer.cs
@@ -35,11 +35,23 @@ namespace HaaSMiddleware.DataAccessTier.Properties {
         [global::System.Configuration.ApplicationScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
         [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
-        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=DELLG5;Database=HaaS_Middleware;integrated security=True;")]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;")]
         public string MiddlewareContext {
             get {
                 return ((string)(this["MiddlewareContext"]));
             }
         }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;")]
+        public string CustomMiddlewareContext {
+            get {
+                return ((string)(this["CustomMiddlewareContext"]));
+            }
+            set {
+                this["CustomMiddlewareContext"] = value;
+            }
+        }
     }
 }
diff --git a/DataAccessTier/Properties/Settings.settings b/DataAccessTier/Properties/Settings.settings
index c6c9c22..fcc42ca 100644
--- a/DataAccessTier/Properties/Settings.settings
+++ b/DataAccessTier/Properties/Settings.settings
@@ -8,10 +8,13 @@
     <Setting Name="MiddlewareContext" Type="(Connection string)" Scope="Application">
       <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
 &lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
-  &lt;ConnectionString&gt;Data Source=DELLG5;Database=HaaS_Middleware;integrated security=True;&lt;/ConnectionString&gt;
+  &lt;ConnectionString&gt;Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;&lt;/ConnectionString&gt;
   &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
 &lt;/SerializableConnectionString&gt;</DesignTimeValue>
-      <Value Profile="(Default)">Data Source=DELLG5;Database=HaaS_Middleware;integrated security=True;</Value>
+      <Value Profile="(Default)">Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;</Value>
+    </Setting>
+    <Setting Name="CustomMiddlewareContext" Type="System.String" Scope="User">
+      <Value Profile="(Default)">Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;</Value>
     </Setting>
   </Settings>
 </SettingsFile>
\ No newline at end of file
diff --git a/DataAccessTier/UnitOfWork/DatabaseUnitOfWork.cs b/DataAccessTier/UnitOfWork/DatabaseUnitOfWork.cs
index 423e830..dee8357 100644
--- a/DataAccessTier/UnitOfWork/DatabaseUnitOfWork.cs
+++ b/DataAccessTier/UnitOfWork/DatabaseUnitOfWork.cs
@@ -19,8 +19,17 @@ namespace HaaSMiddleware.DataAccessTier.UnitOfWork {
 				this.repositoryType = RepositoryType.LinqToEntities;
 		}
 
-		#region Repositories
-		private IAdaptorUserGroupRepository adaptorUserGroupRepository;
+        public DatabaseUnitOfWork(string connString)
+        {
+            Properties.Settings.Default.CustomMiddlewareContext = connString;
+            //Properties.Settings.Default.Save();
+            this.context = new MiddlewareContext();
+            if (!Enum.TryParse(ConfigurationManager.AppSettings["DatabaseRepositoryType"], out this.repositoryType))
+                this.repositoryType = RepositoryType.LinqToEntities;
+        }
+
+        #region Repositories
+        private IAdaptorUserGroupRepository adaptorUserGroupRepository;
 		private IAdaptorUserRepository adaptorUserRepository;
 		private IAdministrationRoleRepository administrationRoleRepository;
 		private IAdministrationUserRepository administrationUserRepository;
diff --git a/DomainObjects/Notifications/Language.cs b/DomainObjects/Notifications/Language.cs
index 90345a9..e37ce0c 100644
--- a/DomainObjects/Notifications/Language.cs
+++ b/DomainObjects/Notifications/Language.cs
@@ -11,8 +11,5 @@ namespace HaaSMiddleware.DomainObjects.Notifications {
 		[Required]
 		[StringLength(50)]
 		public string Name { get; set; }
-
-        //[StringLength(10)]
-        //public string TestColumn { get; set; }
     }
 }
\ No newline at end of file
diff --git a/HpcAsAServiceMiddleware.sln b/HpcAsAServiceMiddleware.sln
index 82229bf..d2f0e2b 100644
--- a/HpcAsAServiceMiddleware.sln
+++ b/HpcAsAServiceMiddleware.sln
@@ -35,6 +35,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServices", "WebServices\
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WsClient", "WsClient\WsClient.csproj", "{542A281B-8D70-45A1-9556-81B4B38B04FA}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiddlewareTests", "MiddlewareTests\MiddlewareTests.csproj", "{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		CD_ROM|Any CPU = CD_ROM|Any CPU
@@ -461,6 +463,36 @@ Global
 		{542A281B-8D70-45A1-9556-81B4B38B04FA}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU
 		{542A281B-8D70-45A1-9556-81B4B38B04FA}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU
 		{542A281B-8D70-45A1-9556-81B4B38B04FA}.SingleImage|x86.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|Any CPU.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|x86.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.CD_ROM|x86.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Debug|x86.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|Any CPU.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|x86.ActiveCfg = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.DVD-5|x86.Build.0 = Debug|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|x86.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.Release|x86.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|Any CPU.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|x86.ActiveCfg = Release|Any CPU
+		{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}.SingleImage|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/MiddlewareTests/App.config b/MiddlewareTests/App.config
new file mode 100644
index 0000000..4c00888
--- /dev/null
+++ b/MiddlewareTests/App.config
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <configSections>
+    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+  </configSections>
+  <appSettings>
+    <add key="dbNamespace" value="HaaS_Middleware" />
+  </appSettings>
+  <entityFramework>
+    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
+      <parameters>
+        <parameter value="mssqllocaldb" />
+      </parameters>
+    </defaultConnectionFactory>
+    <providers>
+      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+    </providers>
+  </entityFramework>
+</configuration>
\ No newline at end of file
diff --git a/MiddlewareTests/MiddlewareTests.csproj b/MiddlewareTests/MiddlewareTests.csproj
new file mode 100644
index 0000000..5c27529
--- /dev/null
+++ b/MiddlewareTests/MiddlewareTests.csproj
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{4EDA931F-42A9-414E-B6C7-2CFDA19A657E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>MiddlewareTests</RootNamespace>
+    <AssemblyName>MiddlewareTests</AssemblyName>
+    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.1.2.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.1.2.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
+    <Reference Include="System.Core" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UnitTest1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\DataAccessTier\DataAccessTier.csproj">
+      <Project>{88827c9b-82af-4302-ac72-4a2636e839eb}</Project>
+      <Name>DataAccessTier</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\DomainObjects\DomainObjects.csproj">
+      <Project>{c3f683c1-16c6-4f99-8ecb-118bac0788c3}</Project>
+      <Name>DomainObjects</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.props'))" />
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.targets'))" />
+  </Target>
+  <Import Project="..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.1.2.1\build\net45\MSTest.TestAdapter.targets')" />
+</Project>
\ No newline at end of file
diff --git a/MiddlewareTests/Properties/AssemblyInfo.cs b/MiddlewareTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..c8ffa01
--- /dev/null
+++ b/MiddlewareTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,20 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("MiddlewareTests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("MiddlewareTests")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: ComVisible(false)]
+
+[assembly: Guid("4eda931f-42a9-414e-b6c7-2cfda19a657e")]
+
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/MiddlewareTests/UnitTest1.cs b/MiddlewareTests/UnitTest1.cs
new file mode 100644
index 0000000..4bcd15a
--- /dev/null
+++ b/MiddlewareTests/UnitTest1.cs
@@ -0,0 +1,27 @@
+using System;
+using HaaSMiddleware.DataAccessTier.UnitOfWork;
+using HaaSMiddleware.DomainObjects.ClusterInformation;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace MiddlewareTests
+{
+    [TestClass]
+    public class UnitTest1
+    {
+        [TestMethod]
+        public static void Main ()
+        {
+            TestCustomDb("Data Source=DELLG5;Database=HaaS_Middleware_1;integrated security=True;");
+            TestCustomDb("Data Source=DELLG5;Database=HaaS_Middleware_2;integrated security=True;");
+        }
+
+        private static void TestCustomDb(string connString)
+        {
+            DatabaseUnitOfWork uof = new DatabaseUnitOfWork(connString);
+            foreach (Cluster c in uof.ClusterRepository.GetAll())
+            {
+                Console.WriteLine(c);
+            }
+        }
+    }
+}
diff --git a/MiddlewareTests/packages.config b/MiddlewareTests/packages.config
new file mode 100644
index 0000000..1301c17
--- /dev/null
+++ b/MiddlewareTests/packages.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="EntityFramework" version="6.2.0" targetFramework="net471" />
+  <package id="MSTest.TestAdapter" version="1.2.1" targetFramework="net471" />
+  <package id="MSTest.TestFramework" version="1.2.1" targetFramework="net471" />
+</packages>
\ No newline at end of file
diff --git a/WebServices/WebServices.csproj.user b/WebServices/WebServices.csproj.user
index 1c7f7a4..ff00e02 100644
--- a/WebServices/WebServices.csproj.user
+++ b/WebServices/WebServices.csproj.user
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <NameOfLastUsedPublishProfile>CiCdPublish</NameOfLastUsedPublishProfile>
+    <NameOfLastUsedPublishProfile>Local</NameOfLastUsedPublishProfile>
     <LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
     <UseIISExpress>true</UseIISExpress>
     <Use64BitIISExpress />
-- 
GitLab