IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> Entity Framework -> ASP.NET 4.0 与 Entity Framework 4 -> 正文阅读

[Entity Framework]ASP.NET 4.0 与 Entity Framework 4

ASP.NET 4.0 与 Entity Framework 4 摘要
本文将向你介绍如何调用存储过程对SQL Server数据库中的数据进行CRUD操作。文中使用的数据库依然是在本系列第一篇文章《采用Model-First 开发方式创建数据库》中创建的,使用的Web页面是在第二篇文章《使用Entity Framework 进行CRUD操作》中创建的 ,可以点击[代码]下载链下载项目文件,要用VS2010打开。
步骤1.创建存储过程
首先需要创建存储过程,第一个存储过程的功能是查表UserAccount记录的,代码如下:

CREATE PROCEDURE dbo.UserAccounts_SelectAll     
AS
      SET NOCOUNT ON
 
      SELECT Id, FirstName, LastName, AuditFields_InsertDate, 
             AuditFields_UpdateDate
        FROM UserAccounts
 
      RETURN

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

CREATE PROCEDURE dbo.UserAccounts_SelectById    
(
      @Id int     
)
AS
      SET NOCOUNT ON 
 
      SELECT Id, FirstName, LastName, AuditFields_InsertDate, 
             AuditFields_UpdateDate
        FROM UserAccounts
       WHERE Id = @Id
 
      RETURN

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

CREATE PROCEDURE dbo.UserAccounts_Insert
(
      @FirstName nvarchar(50),
      @LastName nvarchar(50),
      @AuditFields_InsertDate datetime,
      @AuditFields_UpdateDate datetime
)     
AS
      INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate, 
                                AuditFields_UpdateDate)
      VALUES (@FirstName, @LastName, @AuditFields_InsertDate, 
              @AuditFields_UpdateDate)
 
      SELECT SCOPE_IDENTITY() AS Id

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

CREATE PROCEDURE dbo.UserAccounts_Update
(
      @Id int,
      @FirstName nvarchar(50),
      @LastName nvarchar(50), 
      @AuditFields_UpdateDate datetime
)     
AS
      SET NOCOUNT ON
 
      UPDATE UserAccounts
         SET FirstName = @FirstName,
             LastName = @LastName,
             AuditFields_UpdateDate = @AuditFields_UpdateDate
       WHERE Id = @Id
 
      RETURN

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

CREATE PROCEDURE dbo.UserAccounts_Delete
(
      @Id int     
)     
AS
      SET NOCOUNT ON
 
      DELETE 
        FROM UserAccounts
       WHERE Id = @Id
 
      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之间添加如下代码:

<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视图你会看到表单的样子如下:

步骤4:将数据加载到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()
        {
           ddlUsers.DataSource = from u in db.UserAccounts_SelectAll()
                       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", ""));
            }
        }

注意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.处理点击事件的代码如下:

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()最后实际上是在数据库中执行添加或更新语句。想数据库添加数据时,打开SQL Profiler会看到Insert存储过程被调用。

exec [dbo].[UserAccounts_Insert]
 @FirstName=N'Lloyd',
 @LastName=N'Sheng',
 @AuditFields_InsertDate='2010-04-26 18:14:42.4564241',
 @AuditFields_UpdateDate='2010-04-26 18:14:42.4564241'

步骤6:查询数据
下面是实现当用户选择某一个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);
 
    var userAccounts = from u in db.UserAccounts_SelectById(userAccountId)
                     select u;
 
    txtFirstName.Text = "";
    txtLastName.Text = "";
    lblInserted.Text = "";
    lblUpdated.Text = "";
 
    foreach (UserAccounts_Select_Result userAccount in userAccounts)
    {
      txtFirstName.Text = userAccount.FirstName;
      txtLastName.Text = userAccount.LastName;
      lblInserted.Text = userAccount.AuditFields_InsertDate.ToString();
      lblUpdated.Text = userAccount.AuditFields_UpdateDate.ToString();
    }
  }
}

代码根据Drop Down List选择的Id,调用UserAccounts_SelectById方法从数据库中查询一条数据并且显示出来。
步骤7:删除数据
最后就是删除数据的功能了。 1.转到视图设计器,双击“Delete”按钮。 2.添加如下代码:

if using (OrderDBContainer db = new OrderDBContainer())
{
  if (ddlUsers.SelectedItem.Value != "")
  {
    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的数据源,搞定!
小结
第二篇文章中告诉你如何用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
参考页面:http://qingqingquege.cnblogs.com/p/5933752.html
上一篇文章      下一篇文章      查看所有文章
加:2017-05-03 01:38:45  更:2017-05-14 22:52:36 
 
  Entity Framework 最新文章
Entity Framework 更新模式之Attach与Entit
"MySql.Data.MySqIClient.MySqlProvid
EF Code
EntityFramework 6 (EF6 DBcontext) 并发处
Entity Framework 6 +WinForm (第二篇) 使用
关于有默认值的字段在用EF做插入操作时的思
《Entity Framework 6 Recipes》中文翻译系
《Entity Framework 6 Recipes》翻译系列(2
Entity Framework 6 Recipes 2nd Edition(
EF Fluent API上
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年11日历
2018-11-16 19:35:38
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库