我們有一個龐大的數據庫,有770個表,並希望用EF 6.1x做一些性能測試。實體框架6只包含所有表的一個子集的DBContext
我們只想查詢那770個表中的5個。是否有可能創建一個只有5-6個實體/ DBSets的「輕量級」DBContext,而不是使用完整的770-tables-context?
當我們使用完整的上下文時,帶有4個連接的簡單查詢需要45秒。那44秒太長了。 我們使用代碼優先(反向工程)。
問題: 當我們創建完整的上下文的這樣的「光」的版本(即只有5桌),EF抱怨說,所有在某種程度上涉及到這5個表中的其他實體有丟失的鑰匙。我們只映射這5張表的關鍵字,屬性和關係,但其他關鍵字則不會。
由於用LINQ寫的查詢只查詢5個表,EF應該忽略其他765個表,但它不會。 爲什麼不呢? LazyLoading = true/false似乎對此沒有任何影響。
注意:很明顯,人們可以在數據庫中創建一個視圖,用來處理LINQ查詢的代碼。問題是可以用上面的「輕量級」DbContext來完成。
有「光」版本上下文:
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<...>();
}
}
這當然是可能的,實際上建議。在較大的數據庫環境中,對於表的子集有多個不同的上下文通常會提高性能。 – DavidG 2014-09-02 09:39:04
一些代碼將有助於理解您的問題,但我猜你會尋找類似http://stackoverflow.com/questions/17246069/multiple-dbcontexts-on-one-db-with-code-first-migrations? – fuchs777 2014-09-02 09:43:28
是簡單查詢的第一個exe,那是觸發上下文構建的一個查詢? – tschmit007 2014-09-02 09:57:51