Skip to content

Commit b032018

Browse files
committed
Added DynamicDataMasking support to AddColumn and AlterColumn operations
1 parent 53d3eb1 commit b032018

8 files changed

Lines changed: 81 additions & 23 deletions

File tree

EntityFrameworkCore.Extensions.Samples/EntityFrameworkCore.Extensions.Samples.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,8 @@
2121
</None>
2222
</ItemGroup>
2323

24+
<ItemGroup>
25+
<Folder Include="Migrations\" />
26+
</ItemGroup>
27+
2428
</Project>

EntityFrameworkCore.Extensions.Samples/Migrations/20180616204339_SampleMigration.Designer.cs renamed to EntityFrameworkCore.Extensions.Samples/Migrations/20180619195726_SampleMigration.Designer.cs

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

EntityFrameworkCore.Extensions.Samples/Migrations/20180616204339_SampleMigration.cs renamed to EntityFrameworkCore.Extensions.Samples/Migrations/20180619195726_SampleMigration.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ protected override void Up(MigrationBuilder migrationBuilder)
2121
Phone = table.Column<string>(nullable: true)
2222
.Annotation("DynamicDataMasking", "partial(2, \"XX-XX\", 1)"),
2323
DiscountCardNumber = table.Column<int>(nullable: false)
24-
.Annotation("DynamicDataMasking", "random(10, 100)")
24+
.Annotation("DynamicDataMasking", "random(10, 100)"),
25+
SampleProperty1 = table.Column<string>(nullable: true),
26+
SampleProperty2 = table.Column<string>(nullable: true)
2527
},
2628
constraints: table =>
2729
{
@@ -52,8 +54,6 @@ protected override void Up(MigrationBuilder migrationBuilder)
5254
name: "IX_Order_CustomerId",
5355
table: "Order",
5456
column: "CustomerId");
55-
56-
migrationBuilder.SqlFile("SqlFiles\\ImportCustomers.sql");
5757
}
5858

5959
protected override void Down(MigrationBuilder migrationBuilder)

EntityFrameworkCore.Extensions.Samples/Migrations/SampleContextModelSnapshot.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ protected override void BuildModel(ModelBuilder modelBuilder)
3333
b.Property<string>("Phone")
3434
.HasAnnotation("DynamicDataMasking", "partial(2, \"XX-XX\", 1)");
3535

36+
b.Property<string>("SampleProperty1");
37+
38+
b.Property<string>("SampleProperty2");
39+
3640
b.Property<string>("Surname")
3741
.HasAnnotation("DynamicDataMasking", "default()");
3842

EntityFrameworkCore.Extensions.Samples/Models.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public class Customer
1313
public string Surname { get; set; }
1414
public string Phone { get; set; }
1515
public int DiscountCardNumber { get; set; }
16+
public string SampleProperty1 { get; set; }
17+
public string SampleProperty2 { get; set; }
1618

1719
public IList<Order> Orders { get; set; }
1820
}

EntityFrameworkCore.Extensions.Samples/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
3434
modelBuilder.Entity<Customer>().Property(t => t.Surname).HasAnnotation(AnnotationConstants.DynamicDataMasking, MaskingFunctions.Default());
3535
modelBuilder.Entity<Customer>().Property(t => t.DiscountCardNumber).HasAnnotation(AnnotationConstants.DynamicDataMasking, MaskingFunctions.Random(10, 100));
3636
modelBuilder.Entity<Customer>().Property(t => t.Phone).HasAnnotation(AnnotationConstants.DynamicDataMasking, MaskingFunctions.Partial(2, "XX-XX", 1));
37-
}
37+
}
3838

3939
public DbSet<Customer> Customers { get; set; }
4040
}

EntityFrameworkCore.Extensions/EntityFrameworkCore.Extensions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<PackageProjectUrl>https://github.com/nikitasavinov/EntityFrameworkCore.Extensions</PackageProjectUrl>
88
<Description />
99
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
10+
<Version>1.0.1</Version>
1011
</PropertyGroup>
1112

1213
<ItemGroup>

EntityFrameworkCore.Extensions/Services/ExtendedMigrationSqlServerGenerator.cs

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,77 @@ protected override void Generate(CreateTableOperation operation, IModel model, M
1414
{
1515
base.Generate(operation, model, builder);
1616

17-
foreach (var column in operation.Columns)
17+
foreach (var columnOperation in operation.Columns)
1818
{
19-
var sqlHelper = Dependencies.SqlGenerationHelper;
20-
21-
var addDynamicMask = column.FindAnnotation(AnnotationConstants.DynamicDataMasking);
22-
if (addDynamicMask != null)
23-
{
24-
builder.Append("ALTER TABLE ")
25-
.Append(sqlHelper.DelimitIdentifier(operation.Name, operation.Schema))
26-
.Append($" ALTER COLUMN {column.Name}")
27-
.Append($" ADD MASKED WITH (FUNCTION='{addDynamicMask.Value}')")
28-
.Append(sqlHelper.StatementTerminator)
29-
.EndCommand();
30-
}
19+
AddMaskingFunction(columnOperation, builder);
3120
}
3221
}
3322

23+
protected override void Generate(AddColumnOperation operation, IModel model, MigrationCommandListBuilder builder)
24+
{
25+
base.Generate(operation, model, builder);
26+
27+
AddMaskingFunction(operation, builder);
28+
}
29+
3430
protected override void Generate(AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder)
3531
{
3632
base.Generate(operation, model, builder);
37-
if (operation.OldColumn.FindAnnotation(AnnotationConstants.DynamicDataMasking) != null && operation.FindAnnotation(AnnotationConstants.DynamicDataMasking) == null)
33+
if (ColumnAnnotationAdded(AnnotationConstants.DynamicDataMasking, operation.OldColumn, operation))
34+
{
35+
AddMaskingFunction(operation, builder);
36+
}
37+
if (ColumnAnnotationRemoved(AnnotationConstants.DynamicDataMasking, operation.OldColumn, operation))
38+
{
39+
DropMaskingFunction(operation, builder);
40+
}
41+
}
42+
43+
private void AddMaskingFunction(AlterColumnOperation operation, MigrationCommandListBuilder builder)
44+
{
45+
var sqlHelper = Dependencies.SqlGenerationHelper;
46+
var addDynamicMask = operation.FindAnnotation(AnnotationConstants.DynamicDataMasking);
47+
48+
builder.Append("ALTER TABLE ")
49+
.Append(sqlHelper.DelimitIdentifier(operation.Table, operation.Schema))
50+
.Append($" ALTER COLUMN {operation.Name}")
51+
.Append($" ADD MASKED WITH (FUNCTION='{addDynamicMask.Value}')")
52+
.Append(sqlHelper.StatementTerminator)
53+
.EndCommand();
54+
}
55+
56+
private void AddMaskingFunction(AddColumnOperation column, MigrationCommandListBuilder builder)
57+
{
58+
var sqlHelper = Dependencies.SqlGenerationHelper;
59+
60+
var addDynamicMask = column.FindAnnotation(AnnotationConstants.DynamicDataMasking);
61+
if (addDynamicMask != null)
3862
{
3963
builder.Append("ALTER TABLE ")
40-
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
41-
.Append($" ALTER COLUMN {operation.Name}")
42-
.Append($" DROP MASKED")
43-
.EndCommand();
64+
.Append(sqlHelper.DelimitIdentifier(column.Table, column.Name))
65+
.Append($" ALTER COLUMN {column.Name}")
66+
.Append($" ADD MASKED WITH (FUNCTION='{addDynamicMask.Value}')")
67+
.Append(sqlHelper.StatementTerminator)
68+
.EndCommand();
4469
}
4570
}
71+
72+
private void DropMaskingFunction(AlterColumnOperation operation, MigrationCommandListBuilder builder)
73+
{
74+
builder.Append("ALTER TABLE ")
75+
.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
76+
.Append($" ALTER COLUMN {operation.Name}")
77+
.Append($" DROP MASKED")
78+
.EndCommand();
79+
}
80+
81+
private bool ColumnAnnotationAdded(string annotrationName, ColumnOperation oldColumn, ColumnOperation newColumn)
82+
{
83+
return oldColumn.FindAnnotation(annotrationName) == null && newColumn.FindAnnotation(annotrationName) != null;
84+
}
85+
86+
private bool ColumnAnnotationRemoved(string annotrationName, ColumnOperation oldColumn,
87+
ColumnOperation newColumn)
88+
=> !ColumnAnnotationAdded(annotrationName, oldColumn, newColumn);
4689
}
4790
}

0 commit comments

Comments
 (0)