本文將向你介紹如何使用Entiity Framework對SQL Sever中的資料進行增刪改查(CRUD)操作。文中使用的資料庫是上一篇文章《採用Model-First開發方式建立資料庫》建立的。當然你還需要下載Visual Studio 2010來開啟上一篇文章的專案檔。專案檔的下載連結:點擊下載。
步驟1:修改第一篇文章中的資料庫
在第一篇裡,我們使用EF4建立了2個實體。它們分別是UserAccount和Address,每一個實體都有一個名為Id的主鍵和多個欄位。但是在那篇文章中,沒有告訴大家如何將主鍵設定為Identity欄位,設定為Identity欄位的好處是主鍵可以自增。
1開啟第一篇文章使用的專案檔。
2.雙擊Solution Explorer的OrderDB.edmx檔案,將會看到Entity Framework設計器。
3.點擊UserAccount的Id欄位,查看它的屬性(Alt+Enter)。
4.將StoreGeneratedPattern的設定為Identity,Address實體做同樣的操作。
5.實體更新了,資料庫也要同步更新。右擊視圖設計器選擇"Generate Database From Model",這個時候VS會提示你是否覆蓋OrderDB.edmx.sql檔案 ,點擊"Yes"。
6.覆蓋後,VS會自動開啟OrderDB.edmx.sql檔案,右鍵快顯功能表中選擇 “Execute SQL”。
這時VS會提示你輸入資料數串連資訊,輸入後點擊“connect”就可以了。
步驟2:建立Web表單
下面將在程式中建立一個表單,用來管理UserAccount資料。
1.在專案檔上右鍵,選擇Add->New Item..
2.選擇Web Form模板,將名字改為Users.aspx,點“Add”。
3.在User.aspx的div之間添加如下代碼:
<table> <tr> <td>Select A User:</td> <td><asp:DropDownList runat=server ID="ddlUsers" AutoPostBack="True"> </asp:DropDownList> </td> </tr> <tr> <td>First Name:</td> <td><asp:TextBox runat="server" ID="txtFirstName"></asp:TextBox></td> </tr> <tr> <td>Last Name:</td> <td><asp:TextBox runat="server" ID="txtLastName"></asp:TextBox></td> </tr> <tr> <td>Inserted:</td> <td><asp:Label runat="server" ID="lblInserted"></asp:Label> </td> </tr> <tr> <td>Updated:</td> <td><asp:Label runat="server" ID="lblUpdated"></asp:Label> </td> </tr></table> <asp:Button runat=server ID="btnSave" Text="Save" /><asp:Button ID="btnDelete" runat="server" Text="Delete" />
這裡採用的table的對form進行了簡單的布局。轉到Design視圖你會看到表單的樣子如下:
步驟3:將資料載入到Drop Down List中
要完成的是在頁面載入時,將UserAccount的Name和Id資料載入到Drop Down List中。當選擇特定項時,載入更加詳細的資訊。
1.雙擊Degsin視圖(F7),在後台代碼中添加Page_Load 事件。
2.處理Page_Load 事件的代碼如下:
protected void Page_Load(object sender, EventArgs e){ if (!IsPostBack) { LoadUserDropDownList(); }}
3.Page_Load方法中的LoadUserDropDownList方法代碼如下:
private void LoadUserDropDownList() { using (OrderDBContainer db = new OrderDBContainer()) { ddlUsers.DataSource = from u in db.UserAccounts orderby u.LastName select new { Name = u.LastName + ", " + u.FirstName, Id = u.Id }; ddlUsers.DataTextField = "Name"; ddlUsers.DataValueField = "Id"; ddlUsers.DataBind(); ddlUsers.Items.Insert(0, new ListItem("Create New User", "")); } }
該方法建立了一個OrderDBContainer類的執行個體,這個類在建立OrderDB.edmx自動產生了。它的功能和ADO.NET中的connction類似,我們使用OrderDBContainer串連資料庫,操作資料庫中的對象。這裡的Drop Down List的資料來源是一個Linq查詢。當然,EF將會把它翻譯為SQL 陳述式。Linq就像是SQL倒過來寫,它From語句在前,而SELECT語句在後。本例中,我將所有的UserAccount資料查詢了出來,並且按Last Name排序。同時選擇了Name和Id列,Name是First Name和LastName用逗號拼接而成。
DataTextField屬性設定為Name,DataValueField 設定為Id,這些都是在Linq查詢中建立的。設定完成後,就是綁定了。綁定時,才真正開始調用資料庫查詢的操作。最後給Drop Down List添加一項“Crate New User.”,這項是用來區分更新和添加操作的。
現在資料庫中還沒有任何資料,Drop Down List中只有"Crete New User"一項。如果你開啟了SQL Server Profiler,會看到EF4產生的SQL語句如下:
SELECT [Project1].[Id] AS [Id], [Project1].[C1] AS [C1]FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[LastName] AS [LastName], [Extent1].[LastName] + N', ' + [Extent1].[FirstName] AS [C1] FROM [dbo].[UserAccounts] AS [Extent1]) AS [Project1]ORDER BY [Project1].[LastName] ASC
步驟4:添加和更新資料
下面將向你介紹如何添加和更新表中的資料。
1.轉到設計檢視,雙擊Save按鈕,建立該按鈕的點擊事件。
2.處理點擊事件的代碼如下:
using (OrderDBContainer db = new OrderDBContainer()) { UserAccount userAccount = new UserAccount(); userAccount.FirstName = txtFirstName.Text; userAccount.LastName = txtLastName.Text; userAccount.AuditFields.UpdateDate = DateTime.Now; if (ddlUsers.SelectedItem.Value == "") { //Adding userAccount.AuditFields.InsertDate = DateTime.Now; db.UserAccounts.AddObject(userAccount); } else { //Updating userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue); userAccount.AuditFields.InsertDate = Convert.ToDateTime(lblInserted.Text); db.UserAccounts.Attach(userAccount); db.ObjectStateManager.ChangeObjectState(userAccount, System.Data.EntityState.Modified); } db.SaveChanges(); lblInserted.Text = userAccount.AuditFields.InsertDate.ToString(); lblUpdated.Text = userAccount.AuditFields.UpdateDate.ToString(); //Reload the drop down list LoadUserDropDownList(); //Select the one the user just saved. ddlUsers.Items.FindByValue(userAccount.Id.ToString()).Selected = true; } }
代碼首先建立OrderDBContainer對象,再建立UserAccount對象,用輸入的值填充UserAccount對象屬性。更新日期用系統目前時間,接著判斷是更新操作還是添加操作了。最後就是更新Drop Down List的值並選中剛剛操作的UserAccout。這裡的db.SaveChanges()最後實際上是在資料庫中執行添加或更新語句。
步驟5.查詢資料
下面是實現當使用者選擇某一個Drop Down List項時,顯示詳細資料的功能。
1.雙擊視圖設計器中的Drop Down List,這時會建立Drop Down List的SelectedIndexChanged方法。
2.編寫SelectedIndexChanged方法的代碼如下:
if (ddlUsers.SelectedValue == ""){ txtFirstName.Text = ""; txtLastName.Text = ""; lblInserted.Text = ""; lblUpdated.Text = "";}else{ //Get the user from the DB using (OrderDBContainer db = new OrderDBContainer()) { int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue); List<UserAccount> userAccounts = (from u in db.UserAccounts where u.Id == userAccountId select u).ToList(); if (userAccounts.Count() > 0) { UserAccount userAccount = userAccounts[0]; txtFirstName.Text = userAccount.FirstName; txtLastName.Text = userAccount.LastName; lblInserted.Text = userAccount.AuditFields.InsertDate.ToString(); lblUpdated.Text = userAccount.AuditFields.UpdateDate.ToString(); } else { //Error: didn't find user. txtFirstName.Text = ""; txtLastName.Text = ""; lblInserted.Text = ""; lblUpdated.Text = ""; } }}
代碼根據Drop Down List選擇的Id,用Linq從資料庫中查詢一條資料並且顯示出來。
步驟6:刪除資料
最後就是刪除資料的功能了。 1.轉到視圖設計器,雙擊“Delete”按鈕。 2.添加如下代碼:
if (ddlUsers.SelectedItem.Value != "") { using (OrderDBContainer db = new OrderDBContainer()) { UserAccount userAccount = new UserAccount(); userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue); db.UserAccounts.Attach(userAccount); db.ObjectStateManager.ChangeObjectState(userAccount, System.Data.EntityState.Deleted); db.SaveChanges(); LoadUserDropDownList(); txtFirstName.Text = ""; txtLastName.Text = ""; lblInserted.Text = ""; lblUpdated.Text = ""; }}
代碼首先建立了一個UserAccount對象,將它的Id設定為選中項的Id.然後將UserAccount附加到UserAccount集合中,設定它的狀態為刪除。調用SaveChanges操作,將該條資料刪除,重新整理Drop Down List的資料來源,搞定!
小結
可以發現,使用EF4 輕鬆的就搞定了一般的資料增刪改查操作。
下一篇文章,我將向你介紹如何採用預存程序進行增刪改查操作,而不使用EF產生的SQL語句,希望你能喜歡。
本文相關項目檔案:點擊下載
本文獨立部落格連結:http://lloydsheng.com/2010/04/aspnet40-entityframework4-how-to-crud-using-entityframework.html