Sto sviluppando un'applicazione multi-tenant in ASP.NET Core 2.1
. Sto utilizzando il framework AspNetCore.Identity.EntityFrameworkCore
per la gestione degli utenti. Voglio aggiungere un indice univoco che combina NormalizedName
con TenantId
nella tabella dei Role
. Inoltre, nella tabella utente NormalizedUserName
con TenantId
nella tabella User
.
Ciò non mi consente di creare tale indice poiché l'identità crea un indice univoco predefinito per la tabella Role RoleNameIndex
e UserNameIndex
per la tabella User. Qual è il modo migliore per configurarlo nel metodo OnModelCreating
in EF Core?
modelBuilder.Entity<User>().HasIndex(u => new { u.NormalizedUserName, u.TenantId }).HasName("UserNameIndex").IsUnique(true);
modelBuilder.Entity<Role>().HasIndex(u => new { u.NormalizedName, u.TenantId }).HasName("RoleNameIndex").IsUnique(true);
L'API fluente al momento non fornisce un modo per rimuovere un indice precedentemente definito (come gli indici in questione definiti dal OnModelCreating
base), ma i metadati delle entità mutabili lo fanno tramite il metodo IMutableEntityType.RemoveIndex
.
Può essere usato in questo modo:
modelBuilder.Entity<User>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.NormalizedUserName).Metadata });
builder.HasIndex(u => new { u.NormalizedUserName, u.TenantId }).HasName("UserNameIndex").IsUnique();
});
modelBuilder.Entity<Role>(builder =>
{
builder.Metadata.RemoveIndex(new[] { builder.Property(r => r.NormalizedName).Metadata });
builder.HasIndex(r => new { r.NormalizedName, r.TenantId }).HasName("RoleNameIndex").IsUnique();
});
Non pensare di poterlo fare, a meno che tu non chiami base.OnModelCreating
nel tuo override. Tuttavia, sarai quindi responsabile di tutta la configurazione fluente di Identity. Puoi vedere con cosa hai a che fare qui su Github .
L'unica cosa di cui essere consapevoli, se si scende su quella strada, è che dovrai controllare le modifiche alla configurazione fluente e assicurarti di aggiungerle nella tua mentre vengono introdotte.