聲明:如果你覺得這裡的布局看著不舒服:建議你來這裡閱讀:Entity Framework 中如何更新表中的某個欄位
通常大家特別是初學EF的朋友可能會發現EF中更新一個資料庫中某個表某一列的值一般的例子中都不會有的。
大家基本上都是使用Table和View來直接整個Entity去更新。
比如:
我們更新一個實體User(包含欄位:ID,FirstName,LastName)。
當然,在這個Update操作之前我們需要先插入一條資料到表中。
選用這種方式更新時,因為是attach,所以ORM會把整個表中的ID為1的欄位全部更新。對於欄位比較少的表來說這個還能接受,但是如果我們的表中欄位超過50個,那麼這個Update操作將會是很理想的。
如果我們需要的只是更新FirstName,那麼可以直接只去更新FirstName這個欄位嗎?是可以的。這就得藉助於預存程序。
在Entity Framework中使用預存程序,可能你沒試用過。 其實它和Table的使用差不多。
建立一個預存程序來更新FirstName。
在下一步建立ADO.NET Data Model時記得把預存程序給加進來。建立好Model後,(這裡使用的是edmx檔案自動產生Mapping代碼。沒使用POCO)。與只是使用表和視圖相比,使用預存程序作為Model的DataSource你需要在表的Mapping詳細資料下面選擇你這個表用到的預存程序,如:
這個例子中只有一個預存程序,我們只有選UpdateFirstName。編譯以後你們在edmx的設計模式中看到多了一個function():
1 public int UpdateFirstName(Nullable<global::System.Int32> iD, global::System.String firstName) 2 { 3 ObjectParameter iDParameter; 4 if (iD.HasValue) 5 { 6 iDParameter = new ObjectParameter("ID", iD); 7 } 8 else 9 {10 iDParameter = new ObjectParameter("ID", typeof(global::System.Int32));11 }12 13 ObjectParameter firstNameParameter;14 if (firstName != null)15 {16 firstNameParameter = new ObjectParameter("FirstName", firstName);17 }18 else19 {20 firstNameParameter = new ObjectParameter("FirstName", typeof(global::System.String));21 }22 23 return base.ExecuteFunction("UpdateFirstName", iDParameter, firstNameParameter);24 }25
EF已經自動把為預存程序產生一個function並把它匯入到了ObjectContext中。Amazing。。。。。。。。。。
OK,接下來就是我們來使用這個Update方法了。很簡單:
1 2 // Execute the Update First Name function 3 int i = EfDb.UpdateFirstName(1, "rename");4 5 // you will found the firstname has changed ,who Id is '1'6 EfDb.SaveChanges();
查詢一下結果你會發現ID為1的記錄Firstname欄位已經改變。
Cheers
Nic
Technorati Tags: Entity Framework