Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il modello incorporato OnModelCreating può usare una proprietà nel contesto per modificare la modalità di compilazione del modello. Si supponga, ad esempio, di voler configurare un'entità in modo diverso in base ad alcune proprietà:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (UseIntProperty)
{
modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.StringProperty);
}
else
{
modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.IntProperty);
}
}
Sfortunatamente, questo codice non funzionerebbe as-is, poiché EF compila il modello ed esegue OnModelCreating una sola volta, memorizzando nella cache il risultato per motivi di prestazioni. Tuttavia, è possibile collegarsi al meccanismo di memorizzazione nella cache del modello per rendere EF consapevole della proprietà che produce modelli differenti.
IModelCacheKeyFactory
EF utilizza il IModelCacheKeyFactory per generare chiavi di cache per i modelli; per impostazione predefinita, Entity Framework (EF) presuppone che per qualsiasi tipo di contesto il modello sia lo stesso, quindi l'implementazione predefinita di questo servizio restituisce una chiave che contiene solo il tipo di contesto. Per produrre modelli diversi dallo stesso tipo di contesto, è necessario sostituire il IModelCacheKeyFactory servizio con l'implementazione corretta. La chiave generata verrà confrontata con altre chiavi del modello usando il Equals metodo , tenendo conto di tutte le variabili che influiscono sul modello.
L'implementazione seguente tiene conto di UseIntProperty nella produzione di una chiave della cache del modello.
public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
public object Create(DbContext context, bool designTime)
=> context is DynamicContext dynamicContext
? (context.GetType(), dynamicContext.UseIntProperty, designTime)
: (object)context.GetType();
}
È anche necessario implementare l'overload del metodo Create che gestisce anche la memorizzazione nella cache del modello in fase di progettazione. Come nell'esempio seguente:
public class DynamicModelCacheKeyFactoryDesignTimeSupport : IModelCacheKeyFactory
{
public object Create(DbContext context, bool designTime)
=> context is DynamicContext dynamicContext
? (context.GetType(), dynamicContext.UseIntProperty, designTime)
: (object)context.GetType();
public object Create(DbContext context)
=> Create(context, false);
}
Infine, registra il tuo nuovo IModelCacheKeyFactory nel tuo contesto OnConfiguring.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseInMemoryDatabase("DynamicContext")
.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
Per altre informazioni di contesto, vedere il progetto di esempio completo.