EF默認是支持延遲加載的,在加載一個表的數據時,會把關聯表的數據一并加載,這樣會影響性能。
一般建議關閉延遲加載可以提高EF加載的性能。還有其他方法提高性能(查詢禁用追蹤)
如果要實現延遲加載,必須滿足下邊三個條件,缺一不可
1.context.Configuration.ProxyCreationEnabled應為true。
2.context.Configuration.LazyLoadingEnabled應為true。
3.導航屬性應定義為public virtual xxx,如果屬性未定義為virtual,則Context不會進行延遲加載。
namespace WindowsFormsApp2
{using System;using System.Data.Entity;using System.Data.Entity.Infrastructure;public partial class BankSystemEntities : DbContext{/*DbContext是實體類和數據庫之間的橋梁,DbContext主要負責與數據交互,主要作用:1、DbContext包含所有的實體映射到數據庫表的實體集(DbSet < TEntity >)。2、DbContext 將LINQ-to-Entities查詢轉換為SQL查詢并將其發送到數據庫。3、更改跟蹤: 它跟蹤每個實體從數據庫中查詢出來后發生的修改變化。4、持久化數據: 它也基于實體狀態執行插入、更新和刪除操作到數據庫中。 cxt.SaveChange()*/public BankSystemEntities(): base("name=BankSystemEntities"){Console.WriteLine(this.Configuration.LazyLoadingEnabled);Console.WriteLine(this.Configuration.ProxyCreationEnabled);// 延遲加載禁用了,查詢一個表數據時,不會把導航屬性對應其他表加載出來。this.Configuration.LazyLoadingEnabled = false;//this.Configuration.ProxyCreationEnabled = true;}protected override void OnModelCreating(DbModelBuilder modelBuilder){throw new UnintentionalCodeFirstException();}public virtual DbSet<AddressInfo> AddressInfo { get; set; }public virtual DbSet<CustomerInfo> CustomerInfo { get; set; }public virtual DbSet<StudentInfo> StudentInfo { get; set; }public virtual DbSet<UserInfo> UserInfo { get; set; }}
}
// 如果禁用延遲加載后,又想同時加載關聯表,怎么辦呢?使用Include()
var query10 = cxt.CustomerInfo.Include("AddressInfo").ToList(); // path參數指導航屬性名稱
var query11 = cxt.CustomerInfo.Include(c=>c.AddressInfo).ToList();
// 查詢禁用追蹤
var query12 = cxt.CustomerInfo.AsNoTracking().ToList();