En alternant entre plusieurs modèles avec le même type de DbContextAlternating between multiple models with the same DbContext type

Le modèle généré OnModelCreating Impossible d’utiliser une propriété sur le contexte pour modifier la façon dont le modèle est construit.The model built in OnModelCreating could use a property on the context to change how the model is built. Par exemple, il peut être utilisé pour exclure une propriété donnée :For example it could be used to exclude a certain property:

public class DynamicContext : DbContext
{
    public bool? IgnoreIntProperty { get; set; }

    public DbSet<ConfigurableEntity> Entities { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
            .UseInMemoryDatabase("DynamicContext")
            .ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        if (IgnoreIntProperty.HasValue)
        {
            if (IgnoreIntProperty.Value)
            {
                modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.IntProperty);
            }
            else
            {
                modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.StringProperty);
            }
        }
    }
}

IModelCacheKeyFactoryIModelCacheKeyFactory

Toutefois si vous avez essayé de faire ci-dessus sans apporter de modifications supplémentaires vous pourriez obtenir le même modèle chaque fois qu’un nouveau contexte est créé pour toute valeur de IgnoreIntProperty.However if you tried doing the above without additional changes you would get the same model every time a new context is created for any value of IgnoreIntProperty. Cela est provoqué par le modèle de mise en cache de mécanisme EF utilise pour améliorer les performances en appelant uniquement OnModelCreating qu’une seule fois et le modèle de mise en cache.This is caused by the model caching mechanism EF uses to improve the performance by only invoking OnModelCreating once and caching the model.

Par défaut EF suppose que pour n’importe quel contexte donné le type du modèle sera le même.By default EF assumes that for any given context type the model will be the same. Pour cela l’implémentation par défaut de IModelCacheKeyFactory retourne une clé qui contient seulement le type de contexte.To accomplish this the default implementation of IModelCacheKeyFactory returns a key that just contains the context type. Pour modifier ce vous devez remplacer le IModelCacheKeyFactory service.To change this you need to replace the IModelCacheKeyFactory service. La nouvelle implémentation doit retourner un objet qui peut être comparé à d’autres clés de modèle à l’aide de la Equals méthode qui prend en compte toutes les variables qui affectent le modèle :The new implementation needs to return an object that can be compared to other model keys using the Equals method that takes into account all the variables that affect the model:

public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
    public object Create(DbContext context)
    {
        if (context is DynamicContext dynamicContext)
        {
            return (context.GetType(), dynamicContext.IgnoreIntProperty);
        }
        return context.GetType();
    }
}