[转载]ASP.NET 4.0 与 Entity Framework 4-第三篇-使用Entity Framework调用存储过程

[转载]ASP.NET 4.0 与 Entity Framework 4-第三篇-使用Entity Framework调用存储过程 – Lloyd Sheng Blog – 博客园.

摘要

本文将向你介绍如何调用存储过程对SQL Server数据库中的数据进行CRUD操作。文中使用的数据库依然是在本系列第一篇文章《采 用Model-First 开发方式创建数据库》中创建的,使用的Web页面是在第二篇文章《使 用Entity Framework 进行CRUD操作》中创建的 ,可以点击[代码]下载链下载 项目文件,要用VS2010打开。

步骤1.创建存储过程

首先需要创建存储过程,第一个存储过程的功能是查表UserAccount记录的,代码如下:

  1. CREATE PROCEDURE dbo.UserAccounts_SelectAll
  2. AS
  3. SET NOCOUNT ON
  4. SELECT Id, FirstName, LastName, AuditFields_InsertDate,
  5. AuditFields_UpdateDate
  6. FROM UserAccounts
  7. RETURN

下面一个存储过程功能是通过Id选择UserAccount表中一条记录,代码如下:

  1. CREATE PROCEDURE dbo.UserAccounts_SelectById
  2. (
  3. @Id int
  4. )
  5. AS
  6. SET NOCOUNT ON
  7. SELECT Id, FirstName, LastName, AuditFields_InsertDate,
  8. AuditFields_UpdateDate
  9. FROM UserAccounts
  10. WHERE Id = @Id
  11. RETURN

第三个存储过程的功能是向UserAccounts表中插入一条记录,代码如下:

  1. CREATE PROCEDURE dbo.UserAccounts_Insert
  2. (
  3. @FirstName nvarchar(50),
  4. @LastName nvarchar(50),
  5. @AuditFields_InsertDate datetime,
  6. @AuditFields_UpdateDate datetime
  7. )
  8. AS
  9. INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate,
  10. AuditFields_UpdateDate)
  11. VALUES (@FirstName, @LastName, @AuditFields_InsertDate,
  12. @AuditFields_UpdateDate)
  13. SELECT SCOPE_IDENTITY() AS Id

第四个存储过程的功能是更新UserAccount表中的数据,代码如下:

  1. CREATE PROCEDURE dbo.UserAccounts_Update
  2. (
  3. @Id int,
  4. @FirstName nvarchar(50),
  5. @LastName nvarchar(50),
  6. @AuditFields_UpdateDate datetime
  7. )
  8. AS
  9. SET NOCOUNT ON
  10. UPDATE UserAccounts
  11. SET FirstName = @FirstName,
  12. LastName = @LastName,
  13. AuditFields_UpdateDate = @AuditFields_UpdateDate
  14. WHERE Id = @Id
  15. RETURN

最后一个存储过程的功能是删除UserAccount表中的记录,代码如下:

  1. CREATE PROCEDURE dbo.UserAccounts_Delete
  2. (
  3. @Id int
  4. )
  5. AS
  6. SET NOCOUNT ON
  7. DELETE
  8. FROM UserAccounts
  9. WHERE Id = @Id
  10. RETURN

在我们进行下一步之前,你必须在OrderSystem数据库中创建上面的那些存储过程。

步骤2:将存储过程添加到实体中

打开项目中的OrderDB.edmx文件。打开后,会出现设计器,同时模型浏览器里可以看到数据库的实体,复杂属性和关系。在 OrderDB.edmx右键选择Update Mode From DataBase,这时会出现更新向导,可以看到前面的创建的5个存储过程显示出来。

展开Stored Procedures节点,选择所有存储过程,然后点击完成。这时模型浏览器中会多出5个存储过程对象。

右击模型浏览器中的UserAccounts_SelectAll存储过程选择Add Function Import,这时就可以给OrdersDBContainer类添加一个执行UserAccounts_SelectAll存储过程的方法了。

选择存储过程执行后的返回值类型,当我们要返回一个UserAccount列表,而Framework没有提供这种类型,这时采用这个方法创建会很 方便。我们可以先创建一个复杂类型用来表示存储过程返回值的类型。由于SelectAll 和 SelectById 两个存储过程返回的字段相同,只需创建一种复杂类型。

点击Get Column Information按钮,VS将会检测存储过程返回的字段。当返回字段检测完后,点击下面的Create New Complex Type 按钮,这时会自动选择Complex 选项,复杂类型的名字也会添加到右边下列框中。默认的复杂类型的名字为存储过程的名字加上“Result”。由于将会在多个存储过程返回值中使用该复杂类 型,建议取一个比较通用的名字,这里将名字改为“UserAccounts_Select_Result”,点击OK。

这时你会看到在模型浏览器的Function Imports 文件夹中多了一个UserAccounts_SelectAll方法,同时在复杂类型节点下面多了一个 UserAccounts_Select_Result类型。

右击模型浏览器中的UserAccounts_SelectById 存储过程选择Add Function Import,然后选择UserAccounts_Select_Result 类型作为该存储过程的返回值类型,点击OK。

下面是在UserAccount中使用插入,更新和删除的存储过程,右击设计器中的UserAccount实体选择Stored Procedure Mapping,会出现详细映射窗口。

点击第一行的<Select Insert Function>,在下拉列表中选择UserAccounts_Insert ,在格子中会显示参数列表。我们必须进行实体属性到存储过程参数的映射。由于存储过程会返回新创建记录的Id,必须选择该Id赋值到哪个属性。在 Result Column Bindings节点下的<Add Result Binding>输入Id,这里返回的Id是存储过程中“SELECT SCOPE_IDENTITY() AS Id”,下面是绑定完成后的结果:

映射更 新的存储过程,将<Select Update Function>替换为UserAccounts_Update存储过程。其他的属性自动映射完成,只有 AuditFields_UpdateDate需要自动映射为AuditFields.UpdateDate属性。

最后是映射Delete存储过程,将<Select Delete Function>替换为UserAccounts_Delete存储过程,Id参数映射到和实体的Id属性。

不要忘了保存上面的操作结果,OrdersDBContainer 现在就能使用那些存储过程了,从而进行UserAccount记录的CRUD操作。

步骤3:创建Web表单

下面将在程序中创建一个表单,用来管理UserAccount数据。

1.在项目文件上右键,选择Add->New Item..

2.选择Web Form模板,将名字改为UsersSP.aspx,点“Add”。

3.在UserSP.aspx的div之间添加如下代码:

  1. <table>
  2. <tr>
  3. <td>Select A User:</td>
  4. <td><asp:DropDownList runat=server ID=“ddlUsers” AutoPostBack=“True”>
  5. </asp:DropDownList> </td>
  6. </tr>
  7. <tr>
  8. <td>First Name:</td>
  9. <td><asp:TextBox runat=“server” ID=“txtFirstName”></asp:TextBox></td>
  10. </tr>
  11. <tr>
  12. <td>Last Name:</td>
  13. <td><asp:TextBox runat=“server” ID=“txtLastName”></asp:TextBox></td>
  14. </tr>
  15. <tr>
  16. <td>Inserted:</td>
  17. <td><asp:Label runat=“server” ID=“lblInserted”></asp:Label> </td>
  18. </tr>
  19. <tr>
  20. <td>Updated:</td>
  21. <td><asp:Label runat=“server” ID=“lblUpdated”></asp:Label> </td>
  22. </tr>
  23. </table>
  24. <asp:Button runat=server ID=“btnSave” Text=“Save” />
  25. <asp:Button ID=“btnDelete” runat=“server” Text=“Delete” />

这里采用的table的对form进行了简单的布局。转到Design视图你会看到表单的样子如下:

步骤4:将数据加载到Drop Down List中

要完成的是在页面加载时,将UserAccount的Name和Id数据加载到Drop Down List中。当选择特定项时,加载更加详细的信息。

1.双击Degsin视图(F7),在后台代码中添加Page_Load 事件。

2.处理Page_Load 事件的代码如下:

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. LoadUserDropDownList();
  6. }
  7. }

3.Page_Load方法中的LoadUserDropDownList方法代码如下:

  1. private void LoadUserDropDownList()
  2. {
  3. ddlUsers.DataSource = from u in db.UserAccounts_SelectAll()
  4. orderby u.LastName
  5. select new { Name = u.LastName + “, “ + u.FirstName,
  6. Id = u.Id };
  7. ddlUsers.DataTextField = “Name”;
  8. ddlUsers.DataValueField = “Id”;
  9. ddlUsers.DataBind();
  10. ddlUsers.Items.Insert(0, new ListItem(“Create New User”, “”));
  11. }
  12. }

注意Linq的from语句,它调用OrderDBContainer的UserAccounts_SelectAll方法,这个方法将会执行存储 过程。

DataTextField属性设置为Name,DataValueField 设置为Id,这些都是在Linq查询中创建的。设置完成后,就是绑定了。绑定时,才真正开始调用数据库查询的操作。最后给Drop Down List添加一项“Crate New User.”,这项是用来区分更新和添加操作的。

现在数据库中还没有任何数据,Drop Down List中只有”Crete New User”一项。

步骤5:添加和更新数据

下面将向你介绍如何添加和更新表中的数据。

1.转到设计视图,双击Save按钮,创建该按钮的点击事件。

2.处理点击事件的代码如下:

  1. using (OrderDBContainer db = new OrderDBContainer())
  2. {
  3. UserAccount userAccount = new UserAccount();
  4. userAccount.FirstName = txtFirstName.Text;
  5. userAccount.LastName = txtLastName.Text;
  6. userAccount.AuditFields.UpdateDate = DateTime.Now;
  7. if (ddlUsers.SelectedItem.Value == “”)
  8. {
  9. //Adding
  10. userAccount.AuditFields.InsertDate = DateTime.Now;
  11. db.UserAccounts.AddObject(userAccount);
  12. }
  13. else
  14. {
  15. //Updating
  16. userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
  17. userAccount.AuditFields.InsertDate = Convert.ToDateTime(lblInserted.Text);
  18. db.UserAccounts.Attach(userAccount);
  19. db.ObjectStateManager.ChangeObjectState(userAccount, System.Data.EntityState.Modified);
  20. }
  21. db.SaveChanges();
  22. lblInserted.Text = userAccount.AuditFields.InsertDate.ToString();
  23. lblUpdated.Text = userAccount.AuditFields.UpdateDate.ToString();
  24. //Reload the drop down list
  25. LoadUserDropDownList();
  26. //Select the one the user just saved.
  27. ddlUsers.Items.FindByValue(userAccount.Id.ToString()).Selected = true;
  28. }
  29. }

代码首先创建OrderDBContainer对象,再创建UserAccount对象,用输入的值填充UserAccount对象属性。更新日期 用系统当前时间,接着判断是更新操作还是添加操作了。最后就是更新Drop Down List的值并选中刚刚操作的UserAccout。这里的db.SaveChanges()最后实际上是在数据库中执行添加或更新语句。想数据库添加数 据时,打开SQL Profiler会看到Insert存储过程被调用。

  1. exec [dbo].[UserAccounts_Insert]
  2. @FirstName=N‘Lloyd’,
  3. @LastName=N‘Sheng’,
  4. @AuditFields_InsertDate=‘2010-04-26 18:14:42.4564241’,
  5. @AuditFields_UpdateDate=‘2010-04-26 18:14:42.4564241’

步骤6:查询数据

下面是实现当用户选择某一个Drop Down List项时,显示详细信息的功能。

1.双击视图设计器中的Drop Down List,这时会创建Drop Down List的SelectedIndexChanged方法。

2.编写SelectedIndexChanged方法的代码如下:

  1. if (ddlUsers.SelectedValue == “”)
  2. {
  3. txtFirstName.Text = “”;
  4. txtLastName.Text = “”;
  5. lblInserted.Text = “”;
  6. lblUpdated.Text = “”;
  7. }
  8. else
  9. {
  10. //Get the user from the DB
  11. using (OrderDBContainer db = new OrderDBContainer())
  12. {
  13. int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue);
  14. var userAccounts = from u in db.UserAccounts_SelectById(userAccountId)
  15. select u;
  16. txtFirstName.Text = “”;
  17. txtLastName.Text = “”;
  18. lblInserted.Text = “”;
  19. lblUpdated.Text = “”;
  20. foreach (UserAccounts_Select_Result userAccount in userAccounts)
  21. {
  22. txtFirstName.Text = userAccount.FirstName;
  23. txtLastName.Text = userAccount.LastName;
  24. lblInserted.Text = userAccount.AuditFields_InsertDate.ToString();
  25. lblUpdated.Text = userAccount.AuditFields_UpdateDate.ToString();
  26. }
  27. }
  28. }

代码根据Drop Down List选择的Id,调用UserAccounts_SelectById方法从数据库中查询一条数据并且显示出来。

步骤7:删除数据

最后就是删除数据的功能了。 1.转到视图设计器,双击“Delete”按钮。 2.添加如下代码:

  1. if using (OrderDBContainer db = new OrderDBContainer())
  2. {
  3. if (ddlUsers.SelectedItem.Value != “”)
  4. {
  5. UserAccount userAccount = new UserAccount();
  6. userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
  7. db.UserAccounts.Attach(userAccount);
  8. db.ObjectStateManager.ChangeObjectState(userAccount,
  9. System.Data.EntityState.Deleted);
  10. db.SaveChanges();
  11. LoadUserDropDownList();
  12. txtFirstName.Text = “”;
  13. txtLastName.Text = “”;
  14. lblInserted.Text = “”;
  15. lblUpdated.Text = “”;
  16. }
  17. }

代码首先创建了一个UserAccount对象,将它的Id设置为选中项的Id.然后将UserAccount附加到UserAccount集合 中,设置它的状态为删除。调用SaveChanges操作,将该条数据删除,刷新Drop Down List的数据源,搞定!

小结

第二篇文章中告诉你如何用Entity Framework进行CRUD操作,本篇文章张告诉你如何用存储过程和Entity Framework进行CRUD操作。

在下一篇文章中我将想你介绍如何在三层结构中使用Entity Framework,希望你能喜欢。

项目代码:http://files.cnblogs.com/lloydsheng/OrderSystem3.zip

本文永久链接:http://lloydsheng.com/2010/04/aspnet40-entityframework4-execute-stored-procedures-using-entity-framework4.html

———–全文结束,感谢您的阅读!————-


作者:LloydSheng
出处:http://www.cnblogs.com/lloydsheng/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-LoydShengBlog
如果你也对互联网相关新技术感兴趣,想及时了解更多新鲜有意思的东西,可以关注我的微薄[网易微博| 新浪微博|Twitter]

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏