發表文章

目前顯示的是有「EntityFramework」標籤的文章

SQL Server-預存程序-動態分頁、排序、過濾

前言     目前寫的系統,部份查詢程式會呼叫預存程序,進行較複雜的運算來取得資料,但由於回傳的資料過大,導致雖然在程式端進行了分頁處理,RAM還是會因資料已載入而暴增。      而程式介面的功能設計上,使用者可以在查詢出來的列表,再進行排序、動態過濾、排序及分頁..等,這些功能若要在預存程序處理的話,就要將SQL改成組字串的方式。    這樣原本就已很複雜 的語法會變得更不好維護 , 在考慮先不修預存程序前提下,改用另一個預存程序動態組字串來呼叫本來的預存程序的寫法來達到相同的功能。 SQL 建立Table CREATE TABLE [dbo] . [DemoUser] (        [USER_NO] [varchar] ( 8 ) NOT NULL,        [USER_NAME] [varchar] ( 20 ) NULL )   塞資料 DECLARE @I AS INT DECLARE @MAX AS INT DECLARE @STR_I AS   VARCHAR ( 30 ) SET @I = 1 SET @MAX = 1000000 WHILE ( @I < @MAX ) BEGIN   SET @STR_I = CONVERT ( varchar ( 10 ), @I )   INSERT INTO   DemoUser values ( @STR_I , @STR_I + '@ email.com ' )   SET @I = @I + 1 END 預存-1 查詢資料 create Procedure [dbo] . [Proc_GetUsers] @USER_NO VARCHAR ( 20 ) AS   SELECT   * FROM DemoUser where USER_NO L...

[Debug] Entity Framework參數過長的錯誤

圖片
同事回報一個錯誤是使用者貼上一段文字,執行後,發生錯誤"String or binary data would be truncated"

[Entity Framework ] EDMX更新預存程式回傳欄位

圖片
目前使用EntityFramwork 是透過EF Designer幫我們從資料庫產生预存程序的Mode 問題      若已產生的預存程式Model,若有增加欄位,想要自動將Model更新的話,在目前的作法都會將Model手動刪除在加入一次,會這樣作是因為在EF Designer 的功能[從資料庫更新] 都無法成功,如下圖,有更新視窗,但按更新後,Model還是舊的。雖然手動的方式刪除的方式不會太麻煩,但每次刪除,再加入時在版本控管的簽出簽入會有無法繫結的時候。

[Entity Framework] edmx的欄位轉成列舉

圖片
       EntityFramework的edmx,有2種方式可以將欄位型別為 Byte、Int16、Int32、Int64 或 SByte的欄位轉成列舉型別。1.是透過Designer直接建立新的列舉,2.關聯現有的列舉。 1.建立新的列舉

[Expression Tree] LINQ動態欄位查詢-動態代理類別

圖片
  在前一篇文章" LINQ動態欄位查詢 "介紹到使用Expression來作欄位的動態查詢,但此方法有一缺點是因EntityFramework在查詢時,不能回傳與來源型別一樣的結果,所以使用上會變成查ProductEntity但回傳另一型別ProductInfo。若只是基本的單資料表查詢,那倒還好,但在實務上通常會Join到其他資料表後,再回傳一個多個資料表欄位的類別,如下程式查詢 ProductEntity 及 CategoryEntity ,回傳 ProductInfo 。 此時若要再透過前文的 動態查詢欄位方法 ,則必須建立另一個類別才能達到,例 ProductXXXInfo.........,雖然只要新增一個類別再繼承ProductInfo即可以,但之後隨著系統發展越來越大的話,這種為了動態查詢建立的代理類別會越來越多..........。心想手動建立代理類別的方式可以是動態的嗎....?   印象中EntityFramework預設就有使用代理類別來作LazyLoading機制,心想可以參考相關的作法來實作代理類別,在Google搜尋一下後,找到一篇使用ILGenerator來達到此功能。    什麼是ILGenerator? 根據MSDN的介紹,可以透過它在執行時期產生 Microsoft Intermediate Language (MSIL) 指令,建立動態組件、方法和建構函式...等等 ( 詳原文 )。

[Expression Tree] LINQ動態欄位查詢

   最近專案有一需求是讓使用者挑選所需的欄位來顯示在列表上,以往用SQL語法都是組字串去查詢,但現在用的是Entityframework,若要在LINQ的查詢上作這件事,似乎就沒那麼容易....,幸好前陣子有對Expression作一些學習,將 舊文章 再溫習一篇後將此功能實作出來。 動態查詢欄位 如下程式,相關註解已寫在每行程式上方,唯一較特別的是此方法傳入的IQueryable是 ProductModel 但回傳的是 ProductTargetModel ,這是因為在Linq To Entities的查詢預設不支援同一型別的回傳。

[EntityFramework] 查詢結果將字串轉成列舉

圖片
在EntityFramework5後若你希望Entity的欄位是列舉型別,預設支援數值欄位例:int16 int32 Byte等。但若欄位是字串時,該如何處理? 如下的列舉是對應的Char型別 public enum TrCodes { A = 'A', O = 'O', S = 'S', T = 'T', P = 'P', } 試著在查詢時將Entity的欄位轉成列舉

[EntityFramework] DbContext快取測試

圖片
  針對DbContext在資料存取的內建快取機制作測試記錄。本文案例以 建立一個DbContext為主來執行CRUD ,可能會遇到的問題。 例1:直接以SQL更新或資料庫手動更新後,再查Entity的資料還是舊的 以下的程式在以SQL更新資料庫前,就先查詢該筆Entity。而預設的 快取機制 並不知道你的資料已異動,就算你再執行一次查詢,資料回來還是會是舊的 (更神奇的是用SQL Profiler看,是有執行SQL,只是未填入Entity)。 解決方法:使用AsNoTracking 以上面的程式修改成在第二次查詢時,使用AsNoTracking來直接查資料庫的資料而不使用DbConext的快取

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.ProxyCreationE...

Entityframework-撞牆整理

圖片
前言 針對最近一些撞牆的問題作一下筆記.... 1.關閉初始化檢查:    由於資料表是由同事在負責建立、修改,所以我並不會作去相關的資料表異動。但我的DbContext使用的是CodeFirst的方式來撰寫(並沒有使用edmx來產生poco),這樣的方式在DbContext初始化後第一次執行的命令,還是會作相關的檢查,例:資料庫是否存在、資料表是否存在、Mirgration的檢查等等... 以下為Trace Sql Profiler的截圖

範例學習-MVC Using CodeFirst

圖片
    今天看到微軟提供了一個MVC+EntityFramework Code First的範例覺得還不錯,試了一下後,順道整理一下初次執行範例的一些注意事項: 1.打開專案後先從套件管理員執行套件還原 2.從套件管理員執行”Update-Database” 此動作是為了作第一次的資料庫建立動作及將Migrations內的更新執行到資料庫內 3.以上作完後即可執行範例桯式 ps:由於使用的是LocalDb,所以資料庫建立好並不是專案的App_Data內,而是在預設設定的路徑下 c: \users\[username] 參考文章 ASP.NET MVC Application Using Entity Framework Code First http://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8 SQL Server 2012 Express LocalDB (SqlLocalDB) 深入剖析 http://blog.miniasp.com/post/2012/09/03/SQL-Server-2012-Express-LocalDB-Quick-Start.aspx

使用Code First Enabling Migrations增加欄位

圖片
今天在使用.net 4.5的Membership時,在ApplicationUser類別增加欄位後,執行註冊功能會出現 CodeFirst的錯誤如下圖 這是因為Membership是使用CodeFirst,在第一次執行會先幫你建好資料表,但之後類別若有異動欄位, 則必須下指令告知來更新資料庫。 執行步驟如下: 1.先在"套件管理器主控台(Package Manager Console)"輸入 Enabling Migrations ps:此動作在專案只要執行一次 輸入完後在方案總管會看到Mirgrations目錄及第一次產生的類別 檔名結尾_InitialCreate.cs為依目前資料庫內產生的建立語法 Configurations.cs則為Mirgrations的設定檔 2.在類別增加欄位 3.在"套件管理器主控台(Package Manager Console)"輸入 Add-Migrations first Ps:first為自訂的識別名稱 此時會看到Mirgrations目錄產生一個繼承DbMigration類別,並且已依照增加的欄位將語法產生 此部份是讓你自行再客製用,單純加入欄位可以不用修改 4.最後需在下一個指令為Update-Database就會針對資料庫作建立欄位動作 執行完後檢查資料表,已將欄位加入,大功告成     上述動作其實還可以簡化一些,在 Configuration.cs 有一個 AutomaticMigrationsEnabled 的屬性 只要設為true後,在類別的欄位異動後執行第4步驟的Update-Database也可以達到同樣的效果,但這只適用較簡易的異動,複雜的異動還是透過DbMigration來客製會比較好。 參考文章 http://blog.sanc.idv.tw/2012/04/entity-framework-code-firstenabling.html