Skip to content

Commit

Permalink
Add IColumnModification and IModificationCommand to allow the impleme…
Browse files Browse the repository at this point in the history
…ntations to be replaced easily

Fixes #23027
Fixes #12169
Fixes #17946

Co-authored-by: Kovalenko Dmitry <dmitry.lipetsk@gmail.com>
  • Loading branch information
AndriySvyryd and dmitry-lipetsk committed Jul 23, 2021
1 parent 9ac01d6 commit a0e9e2f
Show file tree
Hide file tree
Showing 44 changed files with 1,171 additions and 485 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static readonly IDictionary<Type, ServiceCharacteristics> RelationalServi
{
{ typeof(IKeyValueIndexFactorySource), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IParameterNameGeneratorFactory), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IComparer<ModificationCommand>), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IComparer<IModificationCommand>), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IMigrationsIdGenerator), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(ISqlGenerationHelper), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IRelationalAnnotationProvider), new ServiceCharacteristics(ServiceLifetime.Singleton) },
Expand All @@ -75,6 +75,7 @@ public static readonly IDictionary<Type, ServiceCharacteristics> RelationalServi
{ typeof(IRelationalQueryStringFactory), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(ICommandBatchPreparer), new ServiceCharacteristics(ServiceLifetime.Scoped) },
{ typeof(IModificationCommandBatchFactory), new ServiceCharacteristics(ServiceLifetime.Scoped) },
{ typeof(IMutableModificationCommandFactory), new ServiceCharacteristics(ServiceLifetime.Singleton) },
{ typeof(IMigrationsModelDiffer), new ServiceCharacteristics(ServiceLifetime.Scoped) },
{ typeof(IMigrationsSqlGenerator), new ServiceCharacteristics(ServiceLifetime.Scoped) },
{ typeof(IMigrator), new ServiceCharacteristics(ServiceLifetime.Scoped) },
Expand Down Expand Up @@ -132,7 +133,7 @@ protected override ServiceCharacteristics GetServiceCharacteristics(Type service
public override EntityFrameworkServicesBuilder TryAddCoreServices()
{
TryAdd<IParameterNameGeneratorFactory, ParameterNameGeneratorFactory>();
TryAdd<IComparer<ModificationCommand>, ModificationCommandComparer>();
TryAdd<IComparer<IModificationCommand>, ModificationCommandComparer>();
TryAdd<IMigrationsIdGenerator, MigrationsIdGenerator>();
TryAdd<IKeyValueIndexFactorySource, KeyValueIndexFactorySource>();
TryAdd<IModelCustomizer, RelationalModelCustomizer>();
Expand All @@ -149,6 +150,7 @@ public override EntityFrameworkServicesBuilder TryAddCoreServices()
TryAdd<IRelationalCommandBuilderFactory, RelationalCommandBuilderFactory>();
TryAdd<IRawSqlCommandBuilder, RawSqlCommandBuilder>();
TryAdd<ICommandBatchPreparer, CommandBatchPreparer>();
TryAdd<IMutableModificationCommandFactory, MutableModificationCommandFactory>();
TryAdd<IMigrationsModelDiffer, MigrationsModelDiffer>();
TryAdd<IMigrationsSqlGenerator, MigrationsSqlGenerator>();
TryAdd<IExecutionStrategyFactory, RelationalExecutionStrategyFactory>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2212,7 +2212,6 @@ private IEnumerable<MigrationOperation> GetDataOperations(

if (forSource)
{
// There shouldn't be any inserts using the source model
Check.DebugAssert(false, "Insert using the source model");
break;
}
Expand All @@ -2236,7 +2235,6 @@ private IEnumerable<MigrationOperation> GetDataOperations(

if (forSource)
{
// There shouldn't be any updates using the source model
Check.DebugAssert(false, "Update using the source model");
break;
}
Expand Down Expand Up @@ -2311,10 +2309,10 @@ private IEnumerable<MigrationOperation> GetDataOperations(
}
}

private object? GetValue(ColumnModification columnModification)
private object? GetValue(IColumnModification columnModification)
{
var converter = GetValueConverter(columnModification.Property!);
var value = columnModification.UseCurrentValueParameter
var value = columnModification.UseCurrentValue
? columnModification.Value
: columnModification.OriginalValue;
return converter != null
Expand Down
50 changes: 24 additions & 26 deletions src/EFCore.Relational/Migrations/MigrationsSqlGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,7 @@ protected virtual void Generate(
/// <param name="operation"> The data operation to generate commands for. </param>
/// <param name="model"> The model. </param>
/// <returns> The commands that correspond to the given operation. </returns>
protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
protected virtual IEnumerable<IModificationCommand> GenerateModificationCommands(
InsertDataOperation operation,
IModel? model)
{
Expand Down Expand Up @@ -976,7 +976,8 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(

for (var i = 0; i < operation.Values.GetLength(0); i++)
{
var modifications = new ColumnModification[operation.Columns.Length];
var modificationCommand = Dependencies.MutableModificationCommandFactory.CreateModificationCommand(
new ModificationCommandParameters(operation.Table, operation.Schema, SensitiveLoggingEnabled));
for (var j = 0; j < operation.Columns.Length; j++)
{
var name = operation.Columns[j];
Expand All @@ -989,14 +990,13 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
? Dependencies.TypeMappingSource.FindMapping(value.GetType(), columnType)
: Dependencies.TypeMappingSource.FindMapping(columnType!);

modifications[j] = new ColumnModification(
modificationCommand.AddColumnModification(new ColumnModificationParameters(
name, originalValue: null, value, propertyMapping?.Property, columnType, typeMapping,
isRead: false, isWrite: true, isKey: true, isCondition: false,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable);
read: false, write: true, key: true, condition: false,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable));
}

yield return new ModificationCommand(
operation.Table, operation.Schema, modifications, sensitiveLoggingEnabled: SensitiveLoggingEnabled);
yield return modificationCommand;
}
}

Expand Down Expand Up @@ -1034,7 +1034,7 @@ protected virtual void Generate(
/// <param name="operation"> The data operation to generate commands for. </param>
/// <param name="model"> The model. </param>
/// <returns> The commands that correspond to the given operation. </returns>
protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
protected virtual IEnumerable<IModificationCommand> GenerateModificationCommands(
DeleteDataOperation operation,
IModel? model)
{
Expand Down Expand Up @@ -1067,7 +1067,8 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(

for (var i = 0; i < operation.KeyValues.GetLength(0); i++)
{
var modifications = new ColumnModification[operation.KeyColumns.Length];
var modificationCommand = Dependencies.MutableModificationCommandFactory.CreateModificationCommand(
new ModificationCommandParameters(operation.Table, operation.Schema, SensitiveLoggingEnabled));
for (var j = 0; j < operation.KeyColumns.Length; j++)
{
var name = operation.KeyColumns[j];
Expand All @@ -1080,14 +1081,13 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
? Dependencies.TypeMappingSource.FindMapping(value.GetType(), columnType)
: Dependencies.TypeMappingSource.FindMapping(columnType!);

modifications[j] = new ColumnModification(
modificationCommand.AddColumnModification(new ColumnModificationParameters(
name, originalValue: null, value, propertyMapping?.Property, columnType, typeMapping,
isRead: false, isWrite: true, isKey: true, isCondition: true,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable);
read: false, write: true, key: true, condition: true,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable));
}

yield return new ModificationCommand(
operation.Table, operation.Schema, modifications, sensitiveLoggingEnabled: SensitiveLoggingEnabled);
yield return modificationCommand;
}
}

Expand Down Expand Up @@ -1125,7 +1125,7 @@ protected virtual void Generate(
/// <param name="operation"> The data operation to generate commands for. </param>
/// <param name="model"> The model. </param>
/// <returns> The commands that correspond to the given operation. </returns>
protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
protected virtual IEnumerable<IModificationCommand> GenerateModificationCommands(
UpdateDataOperation operation,
IModel? model)
{
Expand Down Expand Up @@ -1183,7 +1183,8 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(

for (var i = 0; i < operation.KeyValues.GetLength(0); i++)
{
var keys = new ColumnModification[operation.KeyColumns.Length];
var modificationCommand = Dependencies.MutableModificationCommandFactory.CreateModificationCommand(
new ModificationCommandParameters(operation.Table, operation.Schema, SensitiveLoggingEnabled));
for (var j = 0; j < operation.KeyColumns.Length; j++)
{
var name = operation.KeyColumns[j];
Expand All @@ -1196,13 +1197,12 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
? Dependencies.TypeMappingSource.FindMapping(value.GetType(), columnType)
: Dependencies.TypeMappingSource.FindMapping(columnType!);

keys[j] = new ColumnModification(
modificationCommand.AddColumnModification(new ColumnModificationParameters(
name, originalValue: null, value, propertyMapping?.Property, columnType, typeMapping,
isRead: false, isWrite: false, isKey: true, isCondition: true,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable);
read: false, write: false, key: true, condition: true,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable));
}

var modifications = new ColumnModification[operation.Columns.Length];
for (var j = 0; j < operation.Columns.Length; j++)
{
var name = operation.Columns[j];
Expand All @@ -1215,15 +1215,13 @@ protected virtual IEnumerable<ModificationCommand> GenerateModificationCommands(
? Dependencies.TypeMappingSource.FindMapping(value.GetType(), columnType)
: Dependencies.TypeMappingSource.FindMapping(columnType!);

modifications[j] = new ColumnModification(
modificationCommand.AddColumnModification(new ColumnModificationParameters(
name, originalValue: null, value, propertyMapping?.Property, columnType, typeMapping,
isRead: false, isWrite: true, isKey: true, isCondition: false,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable);
read: false, write: true, key: true, condition: false,
SensitiveLoggingEnabled, propertyMapping?.Column.IsNullable));
}

yield return new ModificationCommand(
operation.Table, operation.Schema, keys.Concat(modifications).ToArray(),
sensitiveLoggingEnabled: SensitiveLoggingEnabled);
yield return modificationCommand;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ public MigrationsSqlGeneratorDependencies(
ISqlGenerationHelper sqlGenerationHelper,
IRelationalTypeMappingSource typeMappingSource,
ICurrentDbContext currentContext,
IMutableModificationCommandFactory modificationCommandFactory,
ILoggingOptions loggingOptions,
IRelationalCommandDiagnosticsLogger logger,
IDiagnosticsLogger<DbLoggerCategory.Migrations> migrationsLogger)
Expand All @@ -79,6 +80,7 @@ public MigrationsSqlGeneratorDependencies(
UpdateSqlGenerator = updateSqlGenerator;
TypeMappingSource = typeMappingSource;
CurrentContext = currentContext;
MutableModificationCommandFactory = modificationCommandFactory;
LoggingOptions = loggingOptions;
Logger = logger;
MigrationsLogger = migrationsLogger;
Expand Down Expand Up @@ -109,6 +111,11 @@ public MigrationsSqlGeneratorDependencies(
/// </summary>
public ICurrentDbContext CurrentContext { get; init; }

/// <summary>
/// The <see cref="IMutableModificationCommand" /> factory.
/// </summary>
public IMutableModificationCommandFactory MutableModificationCommandFactory { get; init; }

/// <summary>
/// The logging options.
/// </summary>
Expand Down
14 changes: 10 additions & 4 deletions src/EFCore.Relational/Migrations/Operations/DeleteDataOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations.Internal;
using Microsoft.EntityFrameworkCore.Update;
using Microsoft.EntityFrameworkCore.Update.Internal;
using Microsoft.EntityFrameworkCore.Utilities;

namespace Microsoft.EntityFrameworkCore.Migrations.Operations
Expand Down Expand Up @@ -61,18 +62,23 @@ public virtual IEnumerable<ModificationCommand> GenerateModificationCommands(IMo
? MigrationsModelDiffer.GetMappedProperties(table, KeyColumns)
: null;

var modificationCommandFactory = new MutableModificationCommandFactory();

for (var i = 0; i < KeyValues.GetLength(0); i++)
{
var modifications = new ColumnModification[KeyColumns.Length];
var modificationCommand = modificationCommandFactory.CreateModificationCommand(new ModificationCommandParameters(
Table, Schema, sensitiveLoggingEnabled: false));
for (var j = 0; j < KeyColumns.Length; j++)
{
modifications[j] = new ColumnModification(
var columnModificationParameters = new ColumnModificationParameters(
KeyColumns[j], originalValue: null, value: KeyValues[i, j], property: properties?[j],
columnType: KeyColumnTypes?[j], isRead: false, isWrite: true, isKey: true, isCondition: true,
columnType: KeyColumnTypes?[j], typeMapping: null, read: false, write: true, key: true, condition: true,
sensitiveLoggingEnabled: false);

modificationCommand.AddColumnModification(columnModificationParameters);
}

yield return new ModificationCommand(Table, Schema, modifications, sensitiveLoggingEnabled: false);
yield return (ModificationCommand)modificationCommand;
}
}
}
Expand Down
15 changes: 11 additions & 4 deletions src/EFCore.Relational/Migrations/Operations/InsertDataOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations.Internal;
using Microsoft.EntityFrameworkCore.Update;
using Microsoft.EntityFrameworkCore.Update.Internal;
using Microsoft.EntityFrameworkCore.Utilities;

namespace Microsoft.EntityFrameworkCore.Migrations.Operations
Expand Down Expand Up @@ -59,18 +60,24 @@ public virtual IEnumerable<ModificationCommand> GenerateModificationCommands(IMo
? MigrationsModelDiffer.GetMappedProperties(table, Columns)
: null;

var modificationCommandFactory = new MutableModificationCommandFactory();

for (var i = 0; i < Values.GetLength(0); i++)
{
var modifications = new ColumnModification[Columns.Length];
var modificationCommand = modificationCommandFactory.CreateModificationCommand(new ModificationCommandParameters(
Table, Schema, sensitiveLoggingEnabled: false));

for (var j = 0; j < Columns.Length; j++)
{
modifications[j] = new ColumnModification(
var columnModificationParameters = new ColumnModificationParameters(
Columns[j], originalValue: null, value: Values[i, j], property: properties?[j],
columnType: ColumnTypes?[j], isRead: false, isWrite: true, isKey: true, isCondition: false,
columnType: ColumnTypes?[j], typeMapping: null, read: false, write: true, key: true, condition: false,
sensitiveLoggingEnabled: false);

modificationCommand.AddColumnModification(columnModificationParameters);
}

yield return new ModificationCommand(Table, Schema, modifications, sensitiveLoggingEnabled: false);
yield return (ModificationCommand)modificationCommand;
}
}
}
Expand Down
Loading

0 comments on commit a0e9e2f

Please sign in to comment.