Przełączanie pomiędzy wiele modeli za pomocą tego samego typu DbContextAlternating between multiple models with the same DbContext type

Wbudowany model OnModelCreating wystarczą właściwości dla kontekstu można zmienić, jak zbudowane jest model.The model built in OnModelCreating could use a property on the context to change how the model is built. Na przykład może zostać wykorzystana do wykluczenia niektórych właściwości: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

Jednak jeśli chcesz wypróbować, wykonując powyższe bez wprowadzania dodatkowych zmian otrzymamy ten sam model za każdym razem, gdy nowy kontekst jest tworzona dla dowolnej wartości 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. Jest to spowodowane przez model używa EF, aby zwiększyć wydajność, wywołując tylko mechanizmu buforowania OnModelCreating raz i buforowanie modelu.This is caused by the model caching mechanism EF uses to improve the performance by only invoking OnModelCreating once and caching the model.

Domyślnie EF przyjęto założenie, że we wszystkich kontekstach danego typu modelu będą takie same.By default EF assumes that for any given context type the model will be the same. Aby to osiągnąć, domyślna Implementacja klasy IModelCacheKeyFactory zwraca klucz, zawierający tylko typ kontekstu.To accomplish this the default implementation of IModelCacheKeyFactory returns a key that just contains the context type. Aby zmienić to musisz zastąpić IModelCacheKeyFactory usługi.To change this you need to replace the IModelCacheKeyFactory service. Nowa implementacja musi zwracać obiekt, który można porównać do innych kluczy modelu przy użyciu Equals metodę, która uwzględnia wszystkie zmienne, które wpływają na modelu: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();
    }
}