Merge pull request #5487 from sbwalker/dev

fix #5462 add logic to check if database already exists before calling EnsureCreated
This commit is contained in:
Shaun Walker
2025-08-13 16:13:59 -04:00
committed by GitHub

View File

@ -7,13 +7,14 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Oqtane.Databases.Interfaces;
using Oqtane.Extensions; using Oqtane.Extensions;
using Oqtane.Models; using Oqtane.Models;
using Oqtane.Repository; using Oqtane.Repository;
using Oqtane.Shared; using Oqtane.Shared;
using Oqtane.Enums; using Oqtane.Enums;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Infrastructure;
// ReSharper disable MemberCanBePrivate.Global // ReSharper disable MemberCanBePrivate.Global
// ReSharper disable ConvertToUsingDeclaration // ReSharper disable ConvertToUsingDeclaration
@ -225,18 +226,27 @@ namespace Oqtane.Infrastructure
if (type != null) if (type != null)
{ {
// create database object from type // create database object from type
var database = Activator.CreateInstance(type) as IDatabase; var database = Activator.CreateInstance(type) as Oqtane.Databases.Interfaces.IDatabase;
// create data directory if does not exist // create data directory if does not exist (for LocalDB and SQLite)
var dataDirectory = AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString(); var dataDirectory = AppDomain.CurrentDomain.GetData(Constants.DataDirectory)?.ToString();
if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory ?? String.Empty); if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory ?? String.Empty);
var dbOptions = new DbContextOptionsBuilder().UseOqtaneDatabase(database, NormalizeConnectionString(install.ConnectionString)).Options; var dbOptions = new DbContextOptionsBuilder().UseOqtaneDatabase(database, NormalizeConnectionString(install.ConnectionString)).Options;
using (var dbc = new DbContext(dbOptions)) using (var dbc = new DbContext(dbOptions))
{ {
// create empty database if it does not exist var databaseCreator = dbc.Database.GetService<IRelationalDatabaseCreator>();
dbc.Database.EnsureCreated(); if (!databaseCreator.Exists())
result.Success = true; {
// create empty database if it does not exist
dbc.Database.EnsureCreated();
result.Success = true;
}
else
{
// assume database is empty and ready for migrations
result.Success = true;
}
} }
} }
else else
@ -653,11 +663,11 @@ namespace Oqtane.Infrastructure
var connectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey)); var connectionString = NormalizeConnectionString(_config.GetConnectionString(SettingKeys.ConnectionStringKey));
var databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey]; var databaseType = _config.GetSection(SettingKeys.DatabaseSection)[SettingKeys.DatabaseTypeKey];
IDatabase database = null; Oqtane.Databases.Interfaces.IDatabase database = null;
if (!string.IsNullOrEmpty(databaseType)) if (!string.IsNullOrEmpty(databaseType))
{ {
var type = Type.GetType(databaseType); var type = Type.GetType(databaseType);
database = Activator.CreateInstance(type) as IDatabase; database = Activator.CreateInstance(type) as Oqtane.Databases.Interfaces.IDatabase;
} }
return new InstallationContext(database, connectionString); return new InstallationContext(database, connectionString);