Skip to content

Commit 613b4a8

Browse files
committedApr 21, 2024
fix: AdjustKey correctly adding TenantId to primary and foreign keys
1 parent 81f5612 commit 613b4a8

File tree

1 file changed

+19
-22
lines changed

1 file changed

+19
-22
lines changed
 

‎src/Finbuckle.MultiTenant.EntityFrameworkCore/MultiTenantEntityTypeBuilder.cs

+19-22
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Copyright Finbuckle LLC, Andrew White, and Contributors.
22
// Refer to the solution LICENSE file for more information.
33

4+
using System;
5+
using System.Collections.Immutable;
46
using System.Linq;
57
using Microsoft.EntityFrameworkCore;
68
using Microsoft.EntityFrameworkCore.Metadata;
79
using Microsoft.EntityFrameworkCore.Metadata.Builders;
10+
using Microsoft.EntityFrameworkCore.Metadata.Internal;
811

912
namespace Finbuckle.MultiTenant.EntityFrameworkCore
1013
{
@@ -24,16 +27,16 @@ public MultiTenantEntityTypeBuilder(EntityTypeBuilder builder)
2427
/// <returns>The MultiTenantEntityTypeBuilder instance.</returns>
2528
public MultiTenantEntityTypeBuilder AdjustIndex(IMutableIndex index)
2629
{
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
2831
IndexBuilder indexBuilder;
2932
Builder.Metadata.RemoveIndex(index);
3033
if (index.Name != null)
3134
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());
3437
else
3538
indexBuilder = Builder.HasIndex(index.Properties.Select(p => p.Name).Append("TenantId").ToArray())
36-
.HasDatabaseName(index.GetDatabaseName());
39+
.HasDatabaseName(index.GetDatabaseName());
3740

3841
if (index.IsUnique)
3942
indexBuilder.IsUnique();
@@ -47,35 +50,29 @@ public MultiTenantEntityTypeBuilder AdjustIndex(IMutableIndex index)
4750
}
4851

4952
/// <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.
5154
/// </summary>
5255
/// <param name="key">The key to adjust for TenantId.</param>
5356
/// <param name="modelBuilder">The modelBuilder for the DbContext.</param>
5457
/// <returns>The MultiTenantEntityTypeBuilder&lt;T&gt; instance.</returns>
5558
public MultiTenantEntityTypeBuilder AdjustKey(IMutableKey key, ModelBuilder modelBuilder)
5659
{
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);
5964

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)
6766
{
6867
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!);
7671
}
7772

78-
Builder.Metadata.RemoveKey(key.Properties);
73+
// remove key
74+
Builder.Metadata.RemoveKey(key);
75+
7976
return this;
8077
}
8178
}

0 commit comments

Comments
 (0)
Please sign in to comment.