diff --git a/src/EFCore.Jet/Infrastructure/Internal/IJetOptions.cs b/src/EFCore.Jet/Infrastructure/Internal/IJetOptions.cs index 7bfedfc..3313986 100644 --- a/src/EFCore.Jet/Infrastructure/Internal/IJetOptions.cs +++ b/src/EFCore.Jet/Infrastructure/Internal/IJetOptions.cs @@ -10,5 +10,6 @@ namespace EntityFrameworkCore.Jet.Infrastructure.Internal /// public interface IJetOptions : ISingletonOptions { + string ConnectionString { get; } } } diff --git a/src/EFCore.Jet/Internal/JetOptions.cs b/src/EFCore.Jet/Internal/JetOptions.cs index 1999d6a..dbf45fd 100644 --- a/src/EFCore.Jet/Internal/JetOptions.cs +++ b/src/EFCore.Jet/Internal/JetOptions.cs @@ -18,6 +18,8 @@ namespace EntityFrameworkCore.Jet.Internal /// public virtual void Initialize(IDbContextOptions options) { + var jetOptions = options.FindExtension() ?? new JetOptionsExtension(); + ConnectionString = jetOptions.Connection?.ConnectionString ?? jetOptions.ConnectionString; } /// @@ -28,5 +30,27 @@ namespace EntityFrameworkCore.Jet.Internal { } + public virtual string ConnectionString { get; private set; } + + protected bool Equals(JetOptions other) + { + return ConnectionString == other.ConnectionString; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (ReferenceEquals(this, obj)) + return true; + if (obj.GetType() != this.GetType()) + return false; + return Equals((JetOptions) obj); + } + + public override int GetHashCode() + { + return (ConnectionString != null ? ConnectionString.GetHashCode() : 0); + } } } diff --git a/src/EFCore.Jet/Migrations/JetMigrationsSqlGenerator.cs b/src/EFCore.Jet/Migrations/JetMigrationsSqlGenerator.cs index 3bb5e0a..1c40c7c 100644 --- a/src/EFCore.Jet/Migrations/JetMigrationsSqlGenerator.cs +++ b/src/EFCore.Jet/Migrations/JetMigrationsSqlGenerator.cs @@ -2,9 +2,12 @@ using System; using System.Collections.Generic; +using System.Data.Jet; +using System.Data.OleDb; using System.IO; using System.Linq; using System.Text.RegularExpressions; +using EntityFrameworkCore.Jet.Infrastructure.Internal; using EntityFrameworkCore.Jet.Metadata; using EntityFrameworkCore.Jet.Metadata.Internal; using EntityFrameworkCore.Jet.Migrations.Operations; @@ -25,16 +28,19 @@ namespace EntityFrameworkCore.Jet.Migrations public class JetMigrationsSqlGenerator : MigrationsSqlGenerator { private readonly IMigrationsAnnotationProvider _migrationsAnnotations; + [NotNull] private readonly IJetOptions _options; private IReadOnlyList _operations; private int _variableCounter; public JetMigrationsSqlGenerator( [NotNull] MigrationsSqlGeneratorDependencies dependencies, - [NotNull] IMigrationsAnnotationProvider migrationsAnnotations) + [NotNull] IMigrationsAnnotationProvider migrationsAnnotations, + [NotNull] IJetOptions options) : base(dependencies) { _migrationsAnnotations = migrationsAnnotations; + _options = options; } @@ -448,11 +454,14 @@ namespace EntityFrameworkCore.Jet.Migrations Check.NotNull(operation, nameof(operation)); Check.NotNull(builder, nameof(builder)); - + var connectionStringBuilder = new OleDbConnectionStringBuilder(_options.ConnectionString); + var provider = string.IsNullOrEmpty(connectionStringBuilder.Provider) + ? JetConfiguration.OleDbDefaultProvider + : connectionStringBuilder.Provider; + builder .Append("CREATE DATABASE ") - .Append(JetConnection.GetConnectionString(ExpandFileName(operation.Name))); - + .Append(JetConnection.GetConnectionString(provider, ExpandFileName(operation.Name))); builder .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator) diff --git a/src/System.Data.Jet/JetConnection.cs b/src/System.Data.Jet/JetConnection.cs index 29ebc52..21576c1 100644 --- a/src/System.Data.Jet/JetConnection.cs +++ b/src/System.Data.Jet/JetConnection.cs @@ -390,6 +390,10 @@ namespace System.Data.Jet AdoxWrapper.CreateEmptyDatabase(connectionString); } + public static string GetConnectionString(string provider, string fileName) + { + return $"Provider={provider};Data Source={fileName}"; + } public static string GetConnectionString(string fileName) { diff --git a/src/System.Data.Jet/JetStoreSchemaDefinition/JetStoreDatabaseHandling.cs b/src/System.Data.Jet/JetStoreSchemaDefinition/JetStoreDatabaseHandling.cs index ed79f03..b02cfa0 100644 --- a/src/System.Data.Jet/JetStoreSchemaDefinition/JetStoreDatabaseHandling.cs +++ b/src/System.Data.Jet/JetStoreSchemaDefinition/JetStoreDatabaseHandling.cs @@ -13,31 +13,28 @@ namespace System.Data.Jet.JetStoreSchemaDefinition static JetStoreDatabaseHandling() { _regExIsCreateOrDropDatabaseCommand = new Regex( - @"(^\s*create\s*database\s*.*$)+|(^drop\s*database\s*.*$)", + @"^\s*(?:create|drop)\s+database\s", RegexOptions.IgnoreCase); _regExParseCreateDatabaseCommand = new Regex( - @"^\s*create\s*database\s*(?.*)\s*$", + @"^\s*create\s+database\s+(?.*?)\s*;*\s*$", RegexOptions.IgnoreCase); _regExParseDropDatabaseCommand = new Regex( - @"^\s*drop\s*database\s*(?.*)\s*;*\s*$", + @"^\s*drop\s+database\s+(?.*?)\s*;*\s*$", RegexOptions.IgnoreCase | RegexOptions.RightToLeft); - _regExParseCreateDatabaseCommandFromConnection = new Regex( - @"^\s*create\s*database\s*(?provider\s*=\s*.*)\s*$", + @"^\s*create\s+database\s+(?provider\s*=\s*.*?)\s*$", RegexOptions.IgnoreCase); _regExParseDropDatabaseCommandFromConnection = new Regex( - @"^\s*drop\s*database\s*(?provider\s*=\s*.*)\s*$", + @"^\s*drop\s+database\s+(?provider\s*=\s*.*?)\s*$", RegexOptions.IgnoreCase); _regExExtractFilenameFromConnectionString = new Regex( - @"provider=.*;\s*data\s+source\s*=\s*(?[^;]*)\s*;?.*$", + @"provider\s*=\s*.*?;\s*data\s+source\s*=\s*(?.*?)\s*(?=;|$)", RegexOptions.IgnoreCase); - - } public static bool TryDatabaseOperation(string commandText)