public CommerceDbTransaction(DbContextTransaction underlyingTransaction, CommerceDatabase database)
        {
            Require.NotNull(underlyingTransaction, "underlyingTransaction");
            Require.NotNull(database, "database");

            UnderlyingTransaction = underlyingTransaction;
            Database = database;
        }
        public void CreateInstance(CommerceInstanceMetadata metadata)
        {
            Require.NotNull(metadata, "metadata");

            var current = _metadataStore.GetByName(metadata.Name);
            if (current != null)
                throw new InvalidOperationException("Commerce instance \"" + metadata.Name + "\" already exists.");

            var dbProvider = _dbProviderFactory.GetDbProvider(metadata.DbProviderInvariantName, metadata.DbProviderManifestToken);
            var connectionString = dbProvider.GetConnectionString(metadata);

            Event.Raise(new CommerceInstanceCreating(metadata));

            try
            {
                CreatePhysicalDatabaseIfNotExists(connectionString);

                using (var database = new CommerceDatabase(metadata, dbProvider))
                {
                    dbProvider.DatabaseOperations.CreateDatabase(database);
                }
            }
            catch(Exception ex)
            {
                throw new CommerceDbException("Commerce instance creation failed: " + ex.Message, ex);
            }

            _metadataStore.Create(metadata);

            Event.Raise(new CommerceInstanceCreated(metadata));

            if (InstanceInitializers != null)
            {
                var instance = OpenInstance(metadata.Name);
                foreach (var initializer in InstanceInitializers)
                {
                    initializer.Initialize(instance);
                }
            }
        }
        public void CreateInstance(CommerceInstanceSettings settings)
        {
            Require.NotNull(settings, "settings");

            var current = _settingsManager.Get(settings.Name);
            if (current != null)
                throw new InvalidOperationException("Commerce instance \"" + settings.Name + "\" already exists.");

            var dbProvider = _dbProviders.Find(settings.DbProviderInvariantName, settings.DbProviderManifestToken);
            var connectionString = dbProvider.GetConnectionString(settings);

            try
            {
                CreatePhysicalDatabaseIfNotExists(connectionString, dbProvider);

                using (var database = new CommerceDatabase(settings))
                {
                    dbProvider.DatabaseOperations.CreateDatabase(database);
                }
            }
            catch (Exception ex)
            {
                throw new CommerceDbException("Commerce instance creation failed: " + ex.Message, ex);
            }

            _settingsManager.Create(settings.Name, settings);

            if (_initializers != null)
            {
                var instance = GetInstance(settings.Name);
                foreach (var initializer in _initializers)
                {
                    initializer.Initialize(instance);
                }
            }

            Event.Raise(new CommerceInstanceCreated(settings.Name, settings), GetInstance(settings.Name));
        }
        public void DeleteInstance(string name)
        {
            var metadata = _metadataStore.GetByName(name);
            if (metadata == null)
                throw new InvalidOperationException("Cannot find metadata for commerce instance: " + name + ".");

            Event.Raise(new CommerceInstanceDeleting(metadata));

            try
            {
                var dbProvider = _dbProviderFactory.GetDbProvider(metadata.DbProviderInvariantName, metadata.DbProviderManifestToken);
                using (var database = new CommerceDatabase(metadata, dbProvider))
                {
                    if (database.DbContext.Database.Exists())
                    {
                        dbProvider.DatabaseOperations.DeleteDatabase(database);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CommerceDbException("Commerce instance deletion failed: " + ex.Message, ex);
            }

            _metadataStore.Delete(name);

            Event.Raise(new CommerceInstanceDeleted(metadata));
        }
        public CommerceInstance OpenInstance(string name)
        {
            Require.NotNullOrEmpty(name, "name");

            var metadata = _metadataStore.GetByName(name);
            if (metadata == null)
                throw new InvalidOperationException("Commerce instance \"" + name + "\" not exists.");

            var dbProvider = _dbProviderFactory.GetDbProvider(metadata.DbProviderInvariantName, metadata.DbProviderManifestToken);
            var database = new CommerceDatabase(metadata, dbProvider);

            return new CommerceInstance(database);
        }
        public void DeleteInstance(string name)
        {
            var settings = _settingsManager.Get(name);
            if (settings == null)
                throw new InvalidOperationException("Cannot find metadata for commerce instance: " + name + ".");

            var instance = GetInstance(name);

            try
            {
                var dbProvider = _dbProviders.Find(settings.DbProviderInvariantName, settings.DbProviderManifestToken);
                using (var database = new CommerceDatabase(settings))
                {
                    if (database.DbContext.Database.Exists())
                    {
                        dbProvider.DatabaseOperations.DeleteDatabase(database);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CommerceDbException("Commerce instance deletion failed: " + ex.Message, ex);
            }

            _settingsManager.Delete(name);

            // Delete instance folder
            var folder = DataFolders.Instances.GetFolder(settings.Name);
            folder.Delete();

            Event.Raise(new CommerceInstanceDeleted(settings.Name, settings), instance);
        }
 public CommerceRepository(CommerceDatabase database, Type entityType)
 {
     _database = database;
     EntityType = entityType;
 }