Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den inbyggda modellen kan använda en egenskap i OnModelCreating kontexten för att ändra hur modellen skapas. Anta till exempel att du vill konfigurera en entitet på ett annat sätt baserat på någon egenskap:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (UseIntProperty)
{
modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.StringProperty);
}
else
{
modelBuilder.Entity<ConfigurableEntity>().Ignore(e => e.IntProperty);
}
}
Tyvärr skulle den här koden inte fungera as-iseftersom EF bygger modellen och kör OnModelCreating bara en gång, och cachelagrar resultatet för prestandaskäl. Du kan dock ansluta till mekanismen för cachelagring av modeller för att göra EF medveten om egenskapen som producerar olika modeller.
IModelCacheKeyFactory
EF använder IModelCacheKeyFactory för att generera cachenycklar för modeller. Som standard förutsätter EF att modellen för en viss kontexttyp är densamma, så standardimplementeringen av den här tjänsten returnerar en nyckel som bara innehåller kontexttypen. Om du vill skapa olika modeller från samma kontexttyp måste du ersätta IModelCacheKeyFactory tjänsten med rätt implementering. Den genererade nyckeln jämförs med andra modellnycklar med hjälp av Equals metoden, med hänsyn till alla variabler som påverkar modellen.
Följande implementering tar UseIntProperty hänsyn till när du skapar en modellcachenyckel:
public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
public object Create(DbContext context, bool designTime)
=> context is DynamicContext dynamicContext
? (context.GetType(), dynamicContext.UseIntProperty, designTime)
: (object)context.GetType();
}
Du måste också implementera överlagringen av Create-metoden som även hanterar cachelagring av designtidsmodeller. Som i följande exempel:
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);
}
Slutligen registrerar du din nya IModelCacheKeyFactory i kontextens OnConfiguring:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseInMemoryDatabase("DynamicContext")
.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
Mer kontext finns i fullständiga exempelprojektet.