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. 踩石行动:ViewPager无限轮播的坑

    2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...

  2. SQLSERVER走起微信公众帐号全新改版 全新首页

    SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...

  3. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  4. JavaScript动画-拖拽改变元素大小

    ▓▓▓▓▓▓ 大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 效果:拖拽改变元素大小 ▓▓▓▓▓▓ 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当 ...

  5. Hawk 6. 高级话题:子流程系统

    子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...

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

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

  7. 第一个移动前端开源项目-dailog

    你还在为手机上没有忙碌光标而发愁吗?你还在抱怨弹出框组件要依赖zepto/jqery吗?你还在纠结是否要自己写一套还是去网上寻找成现成的UI组件吗?YouA为你轻松解决所有烦恼.YouA是我为移动前端 ...

  8. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)

    初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无什么用场.直到学习自然语言处 ...

  9. 多线程同步工具——Lock

    本文原创,转载请注明出处. 参考文章: <"JUC锁"03之 公平锁(一)> <"JUC锁"03之 公平锁(二)> 锁分独占锁与共享锁, ...

  10. 屌丝giser成长记-大学篇

    作为一名屌丝giser的我,刚接触gis专业是2007年的大一,好悲催,当时gis这个专业是被调剂的,我压根都不知道gis为何物,那时候gis冷门的一逼,报名这个专业的寥寥无几.记得那时候得知被调剂到 ...