Entity Framework 学习中级篇3—存储过程(中)

实体框架EF(Entity Framework)简介 是微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。提供变更追踪,唯一性约束,惰性加载、查询事务等功能。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。使用场景:ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。ORM是将数据存储从域对象自动映射到关系数据库的工具。ORM主 阅读详情

目前,EF对存储过程的支持并不完善。存在以下问题:

l         EF不支持存储过程返回多表联合查询的结果集。

l         EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。

l         虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程

l         EF不能直接支持存储过程中Output类型的参数。

l         其他一些问题。

本节,我们将学习如何手动添加/修改存储过程,如何使EF能够支持Output类型的参数。

l         添加/修改存储过程

有时候,某个SQL语句比较复杂,但是数据库中又没有定义相应的存储过程。这个时候,我们又想使上层代码比较简单、方便的方式来完成此项任务。那么,此时,我们便可以手工在实体模型(.edmx文件)中添加自己需要的存储过程了。这样既方便上层调用又方便后期的修改。

以手动修改实体模型edmx文件,添加名为CustomerByCommandText的存储过程为例。具体步骤如下:

修改实体模型文件,找到ssdl部分,添加如下代码:

        <Function Name="CustomerByCommandText" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" >

          <CommandText>

            select c.* from Customers c,Orders o where c.CustomerID=o.CustomerID

          </CommandText>

        </Function>

然后,再找到csdl部分,添加如下代码:

<FunctionImport Name="CustomerByCommandText" EntitySet="Customers" ReturnType="Collection(NorthwindModel.Customers)"></FunctionImport>

接着,找到msl部分,添加如下代码:

<FunctionImportMapping FunctionImportName="CustomerByCommandText" FunctionName="NorthwindModel.Store.CustomerByCommandText"/>

最后,在实体模型的.cs文件里面,添加一个执行此存储过程的方法,代码如下:

        public global::System.Data.Objects.ObjectResult<Customers> GetCustomerByCommandText()

        {

            return base.ExecuteFunction<Customers>("CustomerByCommandText");

        }

至此,修改完毕。

现在,我们就可以在代码使用刚才手工定义的存储过程了。如下代码所示:

[Test]

        public void GetCustomerByCmdText()

        {

            using (var db = new NorthwindEntities())

            {

                var csts = db.GetCustomerByCommandText().Take(10).Skip(0);

                foreach (var c in csts)

                    Console.WriteLine(c.CustomerID);

            }

        }

其实,关键的地方就是CommandText这个部分的内容,它里面就是要执行的SQL语句。另外,我们可以在修改实体模型emdx文件的同时,我们可以看到所有的实体类查询的SQL语句命令都可以在edmx文件里找到,我们都可以进行相应的修改。

l         Output类型参数

在实际应用当中,很多时候,我们需要使用output类型的存储过程参数,以便返回我们需要的值。但是,目前,EF不能直接支持output类型的存储过程参数。为此,我们需要对实体模型进行修改,以便使其支持output类型的输出参数。具体过程如下:

在数据库中建立一个为名的GetNameByCustomerId存储过程,代码如下:

CREATE PROCEDURE GetNameByCustomerId

 @CustomerId varchar(5),

 @ContactName varchar(30) output

AS

BEGIN

 SET NOCOUNT ON;

 SELECT @ContactName=ContactName

 FROM Customers

 WHERE CustomerID=@CustomerId;

END

然后,开始修改实体模型edmx文件。

先找到ssdl定义的部分,添加如下代码:

      <Function Name="GetNameByCustomerId" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">

          <Parameter Name="CustomerId" Type="varchar" Mode="In" MaxLength="5"></Parameter>

          <Parameter Name="ContactName" Type="varchar" Mode="Out" MaxLength="30"></Parameter>

       </Function>

接着,在找到csdl定义的部分,添加如下代码:

      <FunctionImport Name="GetNameByCustomerId">

            <Parameter Name="CustomerId" Mode="In" Type="String" MaxLength="5"></Parameter>

            <Parameter Name="ContactName" Mode="Out" Type="String" MaxLength="30"></Parameter>

      </FunctionImport>

最后,找到msl定义的部分,添加如下代码:

<FunctionImportMapping FunctionImportName="GetNameByCustomerId" FunctionName="NorthwindModel.Store.GetNameByCustomerId"></FunctionImportMapping>

至此,实体模型emdx文件修改完毕。

接下来,我们需要在实体模型的.cs文件中,增加相应的调用方法。代码如下:

    public partial class NorthwindEntities1

{

 

//执行GetNameByCustomerId的方法

        public void GetNameByCustomerId(string CustomerId, out string ContactName)

        {

           ContactName = string.Empty;

            var Pars = new System.Data.EntityClient.EntityParameter[]

            {

                new System.Data.EntityClient.EntityParameter{ ParameterName="CustomerId", DbType=System.Data.DbType.String,Value=CustomerId},

                new System.Data.EntityClient.EntityParameter{ParameterName="ContactName", DbType=System.Data.DbType.String, Direction=System.Data.ParameterDirection.Output}

            };

            this.ExecuteNonQuery("GetNameByCustomerId", Pars);

            ContactName = Pars[1].Value.ToString();

 

        }

     

      //辅助方法,执行SQL命令

        private void ExecuteNonQuery(string functionName, System.Data.EntityClient.EntityParameter[] parameters)

        {

            System.Data.EntityClient.EntityCommand cmd = ((System.Data.EntityClient.EntityConnection)this.Connection).CreateCommand();

            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddRange(parameters);

            cmd.CommandText = this.DefaultContainerName + "." + functionName;

            try

            {

                if (cmd.Connection.State != System.Data.ConnectionState.Open)

                    cmd.Connection.Open();

                cmd.ExecuteNonQuery();

            }

            catch (System.Exception)

            {

                throw;

            }

            finally

            {

                cmd.Connection.Close();

            }

        }

}

现在,所有的修改工作都做完了。接下来,我们就可以在代码中直接调用此存储过程了。示例代码如下:

[Test]

        public void OutputTest()

        {

            using (var db = new NorthwindModel.NorthwindEntities1())

            {

                string contactname = string.Empty;

                db.GetNameByCustomerId("ALFKI", out contactname);

                Assert.IsTrue(!string.IsNullOrEmpty(contactname));

                Console.WriteLine(contactname);

            }

        }

至此,我们便可以使用Output类型的输出参数了。

 
     本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  转自:  ♂风车车.Net
C#(VS2017)EntityFramework增删改查、调用存储过程+FastReport打印范例(数据库SQL2008R2) C#(VS2017)EntityFramework增删改查、调用存储过程+FastReport打印范例(数据库SQL2008R2) 对数据的增删改查、调用存储过程、FastReport打印、修改FastReport打印模版(frx文件) 立即下载

相关推荐

MVC+EF+ 存储过程的小案例

MVC框架, 采用EF技术与数据库进行数据交互, EF操作存储过程。

【转】Entity Framework 学习中级篇2—存储过程

目前,EF对存储过程的支持并不完善。存在以下问题:   l         EF不支持存储过程返回多表联合查询的结果集。   l         EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。   l         虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程 ...

weixin_30399797的博客 151

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 409

Entity Framework Core执行存储过程

这节讲解EF Core中使用FromSqlRaw()& ExecuteCommand() 反复执行存储过程

寒冰屋的专栏 2067

《小白入门:无人机电调 ESC 的 PWM 接口特性、主流协议与使用指南》

电调是无人机的 “动力中枢”,其 PWM 接口是入门的基础,而 SBUS、DroneCAN 等协议则代表了更高阶的控制方式。小白学习时,需先掌握 PWM 的基本特性和连接方法,再根据场景选择合适的协议,同时严格遵守使用注意事项(如电源匹配、校准步骤、安全操作)。随着实践深入,逐步理解 “协议差异” 和 “系统协同”,才能让无人机更稳定、安全地飞行。

bother3000的博客 3769

让 AI 自己“画施工图”——基于扩散模型的智能 CAD 管线生成

AI驱动CAD管线设计革命:Layout2CAD实现30秒自动化出图 针对设计院70%时间耗费在管线绘制的问题,研究团队基于Stable Diffusion开发了Layout2CAD系统,实现建筑草图到DWG施工图的智能转换。该系统采用三阶段流程:语义分割建筑底图→扩散生成多通道Heatmap(含管径/标高信息)→矢量化输出DWG实体,结合129M参数的多模块模型(Diffusion UNet+GraphRefiner)及规范判别器,确保1mm精度并自动满足GB50015-2019标准。

qq_74383080的博客 2014

EF 6 DB-First系列--Entity Framework中的存储过程

Entity Framework能够基于LINQ-to-Entities或Entity SQL查询自动为数据库构建本地命令,以及构建用于插入、更新和删除数据的命令。您可能希望重写这些步骤,并使用您自己的预定义存储过程。您可以使用存储过程获取数据,也可以为一个或多个数据库表添加/更新/删除记录。EF API为目标数据库中的每个存储过程和用户定义函数(UDF)在EDM中创建一个函数,而不是一个实体。让我们使用存储过程从数据库中获取数据。

a859745210b66a6的博客 233

AD9361 官方例程详解(一)

文章目录前言一、pandas是什么?二、使用步骤总结 前言 一、pandas是什么? 二、使用步骤 总结

weixin_44630490的博客 4万+

Entity Framework 4-第三篇-使用Entity Framework调用存储过程

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

Json1204的专栏 6342

Eps总结(1)——Eps入门级基本操作:新建工程、加载数据、新建对象、输入输出对象、基本操作

一、新建工程 1、点击工程的“新建” 2、选择比例尺,自定义工程名字,选择保存路径(最好是英文名字与路径) 二、加载本地倾斜影像、点云、超大影像(正射影像): 其中加载点云数据:a.首先需要将las点云转换为pcd格式。b然后才能加载点云。 三、新建点、线、面等对象 1、首先选择好要画的类型: 2、当选择好要画的类型后,不论是点、线、面都使用左侧工具条中的“一条线”进...

liukunrs的博客 4万+

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8904

Entity Framework 学习中级篇3—存储过程(中)(转)

目前,EF对存储过程的支持并不完善。存在以下问题: l EF不支持存储过程返回多表联合查询的结果集。 l EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。 l 虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程 l...

weixin_30781631的博客 58

12、信号采样与Z变换的全面解析

本文全面解析了信号采样和Z变换的核心概念与应用。内容涵盖采样基础、采样频率与奈奎斯特率的关系、离散时间处理模拟信号的方法、采样率转换技术,以及Z变换的定义、性质、常见变换对和逆变换计算。通过实例分析和流程图展示,帮助读者深入理解数字信号处理的关键步骤,为相关领域的学习与应用打下坚实基础。

Jerry的专栏 119

Entity Framework 学习

Entity Framework 学习

yrryyff的博客 413

Unity中实现俄罗斯方块

二:实现思路 ——创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从(0,0)点开始依次向x轴和y轴延伸,例如x最大为9,y最大为19,则创建了一个20行10列的地图 ——制作每一个形状的预制体,Shape是每一个整体形状,Block是每一块小方块,CenterPos代表这个形状的旋转中心 ——创建GameController脚本控制游戏逻辑,挂载到面板物体上。创建Block脚本控制每个形状的操作,挂载到每个形状上 ——在GameController脚本中编...

L的博客 8560

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Entity Framework入门

Entity Framework入门准备工作 如果使用的visual studio 2010,可安装NuGet Package Manager包管理工具然后使用NuGet程序包管理器来安装 EntityFramework。安装之后,引用中就存在 EntityFramework三种不同的approach: Database First-参考Part 1 - What is Entity Framew

了凡 4371

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Entity Framework学习中级篇

1—EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名...

weixin_30550271的博客 463

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

EF框架学习笔记(一)——ADO.NET Entity Framework 从入门到精通系列学习目录

$tommix_日积月累 不积跬步 无以至千里 平凡生活的点点滴滴 ADO.NET Entity Framework 从入门到精通系列学习教程 ADO.NET Entity Framework 从入门到精通系列学习目录 初级篇 ADO.NET Entity Framework 学习初级篇1--EF基本概况 ADO.NET Entity Framework 学习初级篇2--几个重要类的介...

hhhhhhenrik的博客 4522

Entity Framework 学习中级篇4—存储过程(下)

  在EF中,各个实体的插入、更新和删除也都通过使用存储过程来完成,以便提高点性能。这个类似于数据集。其步骤是:先定义存储过程,然后在VS的可视化设计器,设置存储过程映射即可。 下面,以为Supplier实体映射存储过程为例。 分别建立插入、更新和删除存储过程。 InsertSuppliers存储过程定义如下: CREATE PROCEDURE [dbo].[InsertSupplier...

weixin_34409703的博客 115

Entity FrameWork DBFirst模式(2)之调用存储过程

存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后以后再调用任意次都不需要重新编译了。说白了就是一堆SQL语句的合并,中间加了点逻辑控制,俗称为数据库中的函数。在一些金融等大型企业中,基本都是由内部人员编写好存储过程,然后由外部程序员调用存储过程,因为内部数据逻辑处理方式涉及商业机密等等。 数据库存储过程具有如下优点: 1、存储过程只在创建时进行编译,...

qq_34550459的博客 339

Entity Framework 调用返回标量值的存储过程

最近项目用到EF,虽然说EF与Linq To SQL有很多地方相似,但是EF(这里指3.5版,4.0版的还没去留意)确实有些地方做得不够方便。   就拿存储过程来说吧,EF里面想调用存储过程不是直接在数据库里拖进来就可以用,还要做一个function import的步骤来建立映射。 如果你的存储过程返回的是一个select * from .....的语句的话,那恭喜你,你的存储过程可以直接使用了。...

开心一刻笑话大王 308
上一篇: Entity Framework 学习中级篇2—存储过程(上)
下一篇: Entity Framework 学习中级篇4—存储过程(下)
迷途笛音
博客等级 码龄19年 27粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值