ProxyCreationEnabled=false 測試
前言
這幾天在偵錯EntityFramework時都會看到Entity的型別為Entity+編碼後的DynamicProxy類別,好奇的去找一些文章來瞭解它到底有什麼作用。優點
1.在Lazy Loading=true,可以讓導覽屬性延緩載入 例:RoleEntity底下有一個ICollection<User>屬性。2.用來追蹤變更資訊-->這點我找不到要用在哪及如何使用,找到的說明好像也是.net4.5前才有一些ObjectStateManager的應用..。
缺點
1.WebAPI序列化會發生失敗。2.無法在分散式架構快取。
3.取用導覽屬性時若一開始忘了下Include(),而在foreach又取導覽屬性的資料,會造成大量的查詢次數
ps:這點我還常犯=.=
foreach (var role in roleList)
{
foreach (var user in role.SYSUSER)
{
}
}
將ProxyCreationEnable設為false有何影響?
1.若要取用導覽屬性的資料需自行下Include()。2.Lazy Loading無法使用。
Ps:不知還有沒有其他潛在問題
針對自己在使用上的疑慮作了以下簡單測試
1.IQueryable to List後才執行查詢-->Yes2.Include()是否取得到導覽屬性-->Yes,導覽屬性會使用join的查詢方式,一次載入
3.Entity的異動是否可以更新-->Yes
4.導覽屬性的集合資料是否可以刪除,例:將某一使用者從角色中移除—>ok
static void Main(string[] args) { using (MyEntities db = new MyEntities()) { db.Configuration.ProxyCreationEnabled = false; var roles = db.SYSROLE.Include(o => o.SYSUSER).Where(o => o.ROLE_NO == "10000001"); var roleList = roles.ToList();//1.執行SQL,2.導覽屬性一併取得 var role = roleList.First(); Console.WriteLine(role.GetType().Name); foreach (var user in role.SYSUSER) { Console.WriteLine(user.GetType().Name); } role.ROLE_NAME = "System Administrators3"; role.SYSUSER.Remove(role.SYSUSER.First());//移除某一筆關聯 db.SaveChanges(); } Console.Read(); }
總結:
經過上面的測試結果及在架構上的分層設計,決定將ProxyCreationEnabled關閉。參考文章
http://www.alachisoft.com/resources/articles/entity-framework-poco-lazy-loading.html
http://stackoverflow.com/questions/6198563/entity-framework-proxy-creation