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. PHP-生成缩略图和添加水印图-学习笔记

    1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...

  2. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 终端mysql Operation not permitted错误解决方案

    前言 前段时间装mysql,就遇到了ln: /usr/bin/mysql: Operation not permitted的错误,网上好多方法都过时了,下边是我的解决方法 原因 这是因为苹果在OS X ...

  4. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  5. 显示本地openssl支持的加密算法

    参考页面: http://www.yuanjiaocheng.net/webapi/parameter-binding.html http://www.yuanjiaocheng.net/webapi ...

  6. SOLID 设计原则

    SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...

  7. C#事件-使用事件需要的步骤

    事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...

  8. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  9. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  10. 魅力 .NET:从 Mono、.NET Core 说起

    前段时间,被问了这样一个问题:.NET 应用程序是怎么运行的? 当时大概愣了好久,好像也没说出个所以然,得到的回复是:这是 .NET 程序员最基本的...呵呵! 微软开源,其实不只是对 .NET 本身 ...