1
1
// Copyright Finbuckle LLC, Andrew White, and Contributors.
2
2
// Refer to the solution LICENSE file for more information.
3
3
4
+ using System ;
5
+ using System . Collections . Immutable ;
4
6
using System . Linq ;
5
7
using Microsoft . EntityFrameworkCore ;
6
8
using Microsoft . EntityFrameworkCore . Metadata ;
7
9
using Microsoft . EntityFrameworkCore . Metadata . Builders ;
10
+ using Microsoft . EntityFrameworkCore . Metadata . Internal ;
8
11
9
12
namespace Finbuckle . MultiTenant . EntityFrameworkCore
10
13
{
@@ -24,16 +27,16 @@ public MultiTenantEntityTypeBuilder(EntityTypeBuilder builder)
24
27
/// <returns>The MultiTenantEntityTypeBuilder instance.</returns>
25
28
public MultiTenantEntityTypeBuilder AdjustIndex ( IMutableIndex index )
26
29
{
27
- // Set the new unique index with TenantId preserving name and database name
30
+ // set the new unique index with TenantId preserving name and database name
28
31
IndexBuilder indexBuilder ;
29
32
Builder . Metadata . RemoveIndex ( index ) ;
30
33
if ( index . Name != null )
31
34
indexBuilder = Builder
32
- . HasIndex ( index . Properties . Select ( p => p . Name ) . Append ( "TenantId" ) . ToArray ( ) , index . Name )
33
- . HasDatabaseName ( index . GetDatabaseName ( ) ) ;
35
+ . HasIndex ( index . Properties . Select ( p => p . Name ) . Append ( "TenantId" ) . ToArray ( ) , index . Name )
36
+ . HasDatabaseName ( index . GetDatabaseName ( ) ) ;
34
37
else
35
38
indexBuilder = Builder . HasIndex ( index . Properties . Select ( p => p . Name ) . Append ( "TenantId" ) . ToArray ( ) )
36
- . HasDatabaseName ( index . GetDatabaseName ( ) ) ;
39
+ . HasDatabaseName ( index . GetDatabaseName ( ) ) ;
37
40
38
41
if ( index . IsUnique )
39
42
indexBuilder . IsUnique ( ) ;
@@ -47,35 +50,29 @@ public MultiTenantEntityTypeBuilder AdjustIndex(IMutableIndex index)
47
50
}
48
51
49
52
/// <summary>
50
- /// Adds TenantId to the key and adds a TenantId shadow property on any dependent types' foreign keys.
53
+ /// Adds TenantId to the key and adds the TenantId property to any dependent types' foreign keys.
51
54
/// </summary>
52
55
/// <param name="key">The key to adjust for TenantId.</param>
53
56
/// <param name="modelBuilder">The modelBuilder for the DbContext.</param>
54
57
/// <returns>The MultiTenantEntityTypeBuilder<T> instance.</returns>
55
58
public MultiTenantEntityTypeBuilder AdjustKey ( IMutableKey key , ModelBuilder modelBuilder )
56
59
{
57
- var propertyNames = key . Properties . Select ( p => p . Name ) . Append ( "TenantId" ) . ToArray ( ) ;
58
- var fks = key . GetReferencingForeignKeys ( ) . ToList ( ) ;
60
+ var prop = Builder . Metadata . GetProperty ( "TenantId" ) ;
61
+ var props = key . Properties . Append ( prop ) . ToImmutableList ( ) ;
62
+ var foreignKeys = key . GetReferencingForeignKeys ( ) . ToArray ( ) ;
63
+ var newKey = key . IsPrimaryKey ( ) ? Builder . Metadata . SetPrimaryKey ( props ) : Builder . Metadata . AddKey ( props ) ;
59
64
60
- if ( key . IsPrimaryKey ( ) )
61
- // 6.0 - key replaced on entity, fks changed in-place
62
- Builder . HasKey ( propertyNames ) ;
63
- else
64
- Builder . HasAlternateKey ( propertyNames ) ;
65
-
66
- foreach ( var fk in fks )
65
+ foreach ( var fk in foreignKeys )
67
66
{
68
67
var fkEntityBuilder = modelBuilder . Entity ( fk . DeclaringEntityType . ClrType ) ;
69
- // Note 6.0+ will generate a shadow property with the wrong name in the Properties, we will replace.
70
- var props = fk . Properties . Where ( p => ! p . Name . EndsWith ( "TenantId" ) ) . Select ( p => p . Name ) . Append ( "TenantId" ) . ToArray ( ) ;
71
- fkEntityBuilder . Property < string > ( "TenantId" ) ;
72
- fkEntityBuilder . HasOne ( fk . PrincipalEntityType . ClrType , fk . DependentToPrincipal ? . Name )
73
- . WithMany ( fk . PrincipalToDependent ? . Name )
74
- . HasForeignKey ( props )
75
- . HasPrincipalKey ( propertyNames ) ;
68
+ var newFkProp = fkEntityBuilder . Property < string > ( "TenantId" ) . Metadata ;
69
+ var fkProps = fk . Properties . Append ( newFkProp ) . ToImmutableList ( ) ;
70
+ fk . SetProperties ( fkProps , newKey ! ) ;
76
71
}
77
72
78
- Builder . Metadata . RemoveKey ( key . Properties ) ;
73
+ // remove key
74
+ Builder . Metadata . RemoveKey ( key ) ;
75
+
79
76
return this ;
80
77
}
81
78
}
0 commit comments