我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Entity Framework怎么使用Code First模式管理存储过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Entity Framework怎么使用Code First模式管理存储过程

这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framework怎么使用Code First模式管理存储过程”文章能帮助大家解决问题。

在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand。为了从存储过程中读取很多数据行,我们只需要定义一个类,我们会将检索到的所有数据行物质化到该类实例的集合中。比如,从下面的存储过程读取数据:

CREATE PROCEDURE [dbo].[SelectBooks]@BookTypeName AS NVARCHAR(10)ASBEGINselect B.Name,B.Author,B.PublicationDate,T.BookTypeName from Books as Bjoin BookTypes as T on B.BookTypeId=T.BookTypeId where T.BookTypeName=@BookTypeNameEND

1、定义实体类

Book实体类定义如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeFirstProcedureApp.Model{    public class Book    {        public int Id { get; set; }        public string Name { get; set; }        public string Author { get; set; }        public DateTime PublicationDate { get; set; }        public virtual BookType BookType { get; set; }    }}

BookType实体类定义如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeFirstProcedureApp.Model{    public class BookType    {        public BookType()        {            Books = new HashSet<Book>();        }        public int BookTypeId { get; set; }        public string BookTypeName { get; set; }        public virtual ICollection<Book> Books { get; set; }    }}

2、定义与存储过程结果匹配的实体类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeFirstProcedureApp.Model{    public class BookFromProcedure    {        public string Name { get; set; }        public string Author { get; set; }        public DateTime PublicationDate { get; set; }        public string BookTypeName { get; set; }    }}

注意:类的属性名必须和存储过程中定义的列名一致。

3、创建种子初始化器类

using CodeFirstProcedureApp.Model;using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeFirstProcedureApp.EF{    public class Initializer : DropCreateDatabaseIfModelChanges<EFDbContext>    {        protected override void Seed(EFDbContext context)        {            // 创建初始化数据            BookType bookType = new BookType()            {                BookTypeName = "文学小说",                Books = new List<Book>                {                  new Book(){Name="人间失格",Author="太宰治",PublicationDate=DateTime.Parse("2015-08-01")},                  new Book(){Name="解忧杂货店",Author="东野圭吾",PublicationDate=DateTime.Parse("2014-05-01")},                  new Book(){Name="追风筝的人",Author="卡勒德胡赛尼",PublicationDate=DateTime.Parse("2006-08-01")},                  new Book(){Name="百年孤独",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2011-06-01")},                  new Book(){Name="霍乱时期的爱情",Author="加西亚马尔克斯",PublicationDate=DateTime.Parse("2015-06-01")}                }            };            BookType bookType2 = new BookType()            {                BookTypeName = "科学",                Books = new List<Book>                {                   new Book(){Name="人类简史",Author="尤瓦尔赫拉利",PublicationDate=DateTime.Parse("2017-01-01")}                }            };            context.BookTypes.Add(bookType);            context.BookTypes.Add(bookType2);            base.Seed(context);        }    }}

4、定义数据上下文类

using CodeFirstProcedureApp.Model;using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CodeFirstProcedureApp.EF{    public class EFDbContext :DbContext    {        public EFDbContext()            : base("name=AppConnection")        {            Database.SetInitializer(new Initializer());        }        // 添加到数据上下文中        public DbSet<Book> Books { get; set; }        public DbSet<BookType> BookTypes { get; set; }        protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            // 配置表名和主键            modelBuilder.Entity<Book>().ToTable("Books").HasKey(p => p.Id);            modelBuilder.Entity<BookType>().ToTable("BookTypes").HasKey(p => p.BookTypeId);            // 设置实体关系            //  BookType和 Books 一对多关系 外键:BookTypeId            modelBuilder.Entity<BookType>().HasMany(p => p.Books).WithRequired(t => t.BookType)                .Map(m =>                {                    m.MapKey("BookTypeId");                });            base.OnModelCreating(modelBuilder);        }    }}

5、运行程序

使用SQL语句创建存储过程:

var createSql = @"CREATE PROCEDURE [dbo].[SelectBooks]                                    @BookTypeName AS NVARCHAR(10)                                    AS                                    BEGIN                                    select B.Name,B.Author,B.PublicationDate,T.BookTypeName from Books as B                                    join BookTypes as T on B.BookTypeId=T.BookTypeId where T.BookTypeName=@BookTypeName                                    END";context.Database.ExecuteSqlCommand(createSql);

查看数据库:

Entity Framework怎么使用Code First模式管理存储过程

调用存储过程查询数据

注意:在使用存储过程前,先要在存储过程中执行该存储过程或者使用上面的程序生成存储过程。

var sql = "SelectBooks {0}";var books = context.Database.SqlQuery<BookFromProcedure>(sql, "文学小说");books.ToList().ForEach(p =>{      Console.WriteLine("BookName:" + p.Name + "     Author:" + p.Author + "    BookTypeName:" + p.BookTypeName + "     PublicationDate:" + p.PublicationDate);});

在上面的代码中,我们制定了使用哪个类读取查询的结果,创建SQL语句时,也为存储过程的参数提供了一个格式化占位符,调用SqlQuery时为那个参数提供了一个值。假如要提供多个参数的话,多个格式化占位符必须要用逗号分隔,还要给SqlQuery提供值的数组。我们也可以使用表值函数代替存储过程。存储过程执行结果如下:

Entity Framework怎么使用Code First模式管理存储过程

6、执行无返回值的存储过程

另一个用例就是假如存储过程没有任何的返回值,只是对数据库中的一张表或者多张表执行了一条命令的情况。一个存储过程做了多少事情不重要,重要的是它不返回任何数据。例如:下面的存储过程只是更新了一些数据:

CREATE PROCEDURE UpdateBooks@name AS NVARCHAR(60),@id as intAS BEGINUPDATE Books SET Name=@nameWHERE Id=@idEND

 先在数据库中执行该存储过程,然后要调用该存储过程,我们使用ExecuteSqlCommand()方法。该方法会返回存储过程或者其它任何SQL语句受影响的行数。如果对这个返回值不感兴趣,可以忽略返回值。

var sql = "UpdateBooks @name,@id";SqlParameter[] para = new SqlParameter[]{       new SqlParameter("@id",1d),       new SqlParameter("@name","人间失败"),};var book = context.Books.Where(p => p.Id == 1);Console.WriteLine("执行存储过程前的数据为:");foreach (var item in book){       Console.WriteLine(item.Name + "\t" + item.Author + "\t" + item.PublicationDate);}var rowsAffected = context.Database.ExecuteSqlCommand(sql, para);Console.WriteLine("影响的行数为{0}条", rowsAffected);Console.WriteLine("执行存储过程之后的数据为:");var books = context.Books.Where(p => p.Id == 1);foreach (var item in books){        Console.WriteLine(item.Name + "\t" + item.Author + "\t" + item.PublicationDate);}

上面的代码中为存储过程提供了两个参数:一个是Name,一个是Id。这里需要注意的是:我们必须严格按照它们在存储过程中定义的顺序依次传入相应的值,它们会以参数数组传入ExecuteSqlCommand。执行结果如下:

Entity Framework怎么使用Code First模式管理存储过程

很大程度上,EF降低了存储过程的需要。然而,仍旧有很多原因要使用它们。这些原因包括安全标准、遗留数据库或者效率问题。比如,如果需要在单个操作中更新几千条数据,然后在通过EF检索出来;如果每次都更新一行,然后在保存那些实例,效率是很低的。最后,即使使用了SqlQuery()方法调用了存储过程,也可以更新数据。

注意:开发者可以执行任意的SQL语句,只需要将上面SqlQuery或ExecuteSqlCommand方法中的存储过程名称改为要执行的SQL语句就可以了。 

关于“Entity Framework怎么使用Code First模式管理存储过程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Entity Framework怎么使用Code First模式管理存储过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Entity Framework怎么使用Code First模式管理存储过程

这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framework怎么使用Code Firs
2023-06-29

Entity Framework怎么使用Code First模式管理事务

今天小编给大家分享一下Entity Framework怎么使用Code First模式管理事务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
2023-06-29

Entity Framework中怎么使用Code First模式管理视图

今天小编给大家分享一下Entity Framework中怎么使用Code First模式管理视图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
2023-06-29

Entity Framework如何使用Code First模式管理数据库

这篇文章主要为大家展示了“Entity Framework如何使用Code First模式管理数据库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Entity Framework如何使用Code
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录