10-8. 映射插入、修改、删除操作到存储过程

问题

想要映射插入、修改、删除操作到存储过程

解决方案

假设已有运动员实体模型,如Figure 10-8所示. 对应的数据库表如Figure 10-9所示. 我们想要用存储过程来执行插入,修改,删除操作。

Figure 10-8. 运动员实体模型

Figure 10-9. 包含一些基本信息的运动员表

为实体映射存储过程到插入,修改,删除操作,执行以下操作:

1.在数据库里,创建如Listing 10-21所示的存储过程

Listing 10-21. The Stored Procedures for the Insert, Update, and Delete Actions

create procedure [chapter10].[InsertAthlete]

(@Name varchar(50), @Height int, @Weight int)

as

begin

insert into Chapter10.Athlete values (@Name, @Height, @Weight)

select SCOPE_IDENTITY() as AthleteId

end

go

create procedure [chapter10].[UpdateAthlete]

(@AthleteId int, @Name varchar(50), @Height int, @Weight int)

as

begin

update Chapter10.Athlete set Name = @Name, Height = @Height, [Weight] = @Weight

where AthleteId = @AthleteId

end

go

create procedure [chapter10].[DeleteAthlete]

(@AthleteId int)

as

begin

delete from Chapter10.Athlete where AthleteId = @AthleteId

end

2. 右击模型设计视图,选择“从数据库更新模型”,选择上面创建的三个存储过程,单击“完成”,这样存储过程就添加到了模型中

3. 右击Athlete实体, 选择“存储过程映射”,为每个操作选择对应的存储过程. 为插入操作的“结果列绑定” AthleteId (见Figure 10-10).

Figure 10-10. 映射存储过程,参数,和返回值 后的操作、修改、删除操作

它是如何工作的?

我们用存储过程更新了模型,这样模型就可以使用存储过程了,然后我们映射存储过程到实体的插入、修改、删除操作上.

在本小节, 我们尽可能让存储过程简单. 它们从实体属性里获取参数,并且执行操作.插入操作里我们需要返回存储过程返回自增列的ID值给实体.所以需要把存储过程返回的Id值映射到实体的AthleteId属性,这一步很重要.没有这一步,EF不能获取新创建的实体ID。

你可能会问“我什么时候把存储过程映射到实体操作了?”,其实大多数情况下,EF会自动为插入、修改、删除操作生成高效的代码。

你可能也会想知道:“那我什么时候需要用存储过程来映射操作?”,这个问题的答案有个最佳的实践:

•当你公司要求你用存储过程插入、修改、删除来操作表的时候。

• 你有一个额外的任务,需要执行额外的操作.比如, 你想要管理一个审计运算或执行一些复杂的业务逻辑, 又或是对一个用户进行权限安全检查等。

• 你的实体基于查询视图(QueryView) (见第6章和15章)

static void Main(string[] args)

{

using (var context = new EFRecipesEntities1008())

{

context.Database.ExecuteSqlCommand("delete from chapter10.Athlete");

context.Athletes.Add(new Athlete

{

Name = "Nancy Steward",

Height = 167,

Weight = 53

});

context.Athletes.Add(new Athlete

{

Name = "Rob Achers",

Height = 170,

Weight = 77

});

context.Athletes.Add(new Athlete

{

Name = "Chuck Sanders",

Height = 171,

Weight = 82

});

context.Athletes.Add(new Athlete

{

Name = "Nancy Rodgers",

Height = 166,

Weight = 59

});

context.SaveChanges();

}

using (var context = new EFRecipesEntities1008())

{

var all = context.Athletes;

context.Athletes.Remove(all.First(o => o.Name == "Nancy Steward"));

all.First(o => o.Name == "Rob Achers").Weight = 80;

context.SaveChanges();

}

using (var context = new EFRecipesEntities1008())

{

Console.WriteLine("All Athletes");

Console.WriteLine("============");

foreach (var athlete in context.Athletes)

{

Console.WriteLine("{0} weighs {1} Kg and is {2} cm in height",

athlete.Name, athlete.Weight, athlete.Height);

}

}

Console.WriteLine("\nPress any key to exit...");

Console.ReadKey();

}

输出结果如下Listing 10-22所示:


All Athletes

============

Rob Achers weighs 80 Kg and is 170 cm in height

Chuck Sanders weighs 82 Kg and is 171 cm in height

Nancy Rodgers weighs 59 Kg and is 166 cm in height


附:创建示例用到的数据库的脚本文件

Entity Framework 6 Recipes 2nd Edition(10-8)译 - >映射插入、修改、删除操作到存储过程的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体

    第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...

  3. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  4. Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  5. Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询

    问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...

  6. Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  7. Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体

    问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...

  8. Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高

    问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...

  9. Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include

    问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...

  10. Entity Framework 6 Recipes 2nd Edition(目录索引)

    Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...

随机推荐

  1. Java 线程

    线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...

  2. 用CIL写程序:你好,沃尔德

    前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了.以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾. ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(69)-微信公众平台开发-功能概述

    系列目录 为什么要先发这个文章? 因为接下来的文章是关于微信开发的系列,心中一定要有一个概念,知道自己接下来要做什么功能. 而且微信到处都是坑,我首先要把微信与本地跑通起来才敢发布,否则中间出现坑导致 ...

  4. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  5. CSS样式重置(转)

    body,h1,h2,h3,h4,h5,h6,dl,dt,dd,ul,ol,li,th,td,p,blockquote,pre,form,fieldset,legend,input,button,te ...

  6. 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...

  7. Web安全相关(三):开放重定向(Open Redirection)

    简介 那些通过请求(如查询字符串和表单数据)指定重定向URL的Web程序可能会被篡改,而把用户重定向到外部的恶意URL.这种篡改就被称为开发重定向攻击.   场景分析 假设有一个正规网站http:// ...

  8. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  9. Android Fragment 剖析

    1.Fragment如何产生?2.什么是Fragment Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后 ...

  10. 如何搭建git服务器

    一.前言 现在越来越多的公司用git进行版本控制,不过git是默认是开源的,如果私有的话是需要付费的,如果不想付费自己可以搭建一个git服务器用来版本控制. 二.服务器端操作 1.安装git sudo ...