Abbiamo un enorme database con 770 tabelle e vogliamo fare un test delle prestazioni con EF 6.1x.Entity Framework 6 DBContext con solo un sottoinsieme di tutte le tabelle
Vogliamo interrogare solo 5 di quelle 770 tabelle. È possibile creare un DBContext "leggero" con solo 5-6 entità/DBSet invece di utilizzare l'intero contesto 770-tabelle?
Quando si utilizza il contesto completo, una query semplice con 4 join richiede 45 secondi. Sono 44 secondi troppo lunghi. Utilizziamo il codice prima (reverse engineering).
Il problema: Quando creiamo una versione come "luce" del contesto completo (vale a dire 5 tavoli solo), EF si lamenta che tutti gli altri soggetti che sono in qualche modo legati a questi 5 tabelle hanno chiavi mancanti. Mappiamo solo le chiavi, le proprietà, le relazioni per quei 5 tavoli, ma non il resto.
Poiché la query scritta in LINQ richiede solo 5 tabelle, EF deve semplicemente ignorare le altre tabelle 765, ma non lo farà. Perché no? LazyLoading = true/false non sembra avere alcuna influenza su questo.
Nota: Ovviamente si potrebbe creare una vista nel DB che esegue ciò che facciamo in codice con una query LINQ. La domanda è che si può fare con un DbContext "leggero" come sopra.
C'è la versione "light" del contesto:
public class ItemLookupContext : DbContext
{
static ItemLookupContext()
{
Database.SetInitializer<ItemLookupContext>(null);
}
public ItemLookupContext()
: base("Name=ItemLookupContext")
{
//Configuration.LazyLoadingEnabled = true;
}
public DbSet<Identity> Identities { get; set; }
public DbSet<Item> Items { get; set; }
public DbSet<Price> Prices { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Brand> Brands { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new IdentityMap());
modelBuilder.Configurations.Add(new ItemMap());
modelBuilder.Configurations.Add(new PriceMap());
modelBuilder.Configurations.Add(new DepartmentMap());
modelBuilder.Configurations.Add(new BrandMap());
//ignore certain entitities to speed up loading?
//does not work
modelBuilder.Ignore<...>();
modelBuilder.Ignore<...>();
modelBuilder.Ignore<...>();
modelBuilder.Ignore<...>();
modelBuilder.Ignore<...>();
}
}
È certamente possibile e effettivamente consigliato. In ambienti di database più grandi, è spesso un aumento delle prestazioni avere più contesti diversi per sottoinsiemi di tabelle. – DavidG
un po 'di codice sarebbe utile per capire il tuo problema ma immagino che cerchi qualcosa come http://stackoverflow.com/questions/17246069/multiple-dbcontexts-on-one-db-with-code-first-migrations? – fuchs777
è la query semplice il primo del file exe, ovvero la query che attiva la creazione del contesto? – tschmit007