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後才執行查詢-->Yes
2.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

這個網誌中的熱門文章

[.NET Core] 將專案發行至IIS

[TFS] 分支與合併