iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >EntityFramework使用CodeFirst模式管理存储过程
  • 749
分享到

EntityFramework使用CodeFirst模式管理存储过程

2024-04-02 19:04:59 749人浏览 安东尼
摘要

在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:sqlQuery和ExecuteSqlCommand。为了从存储过程中读取很多数据行,我们只需要

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

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

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);

查看数据库

调用存储过程查询数据

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

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提供值的数组。我们也可以使用表值函数代替存储过程。存储过程执行结果如下:

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

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

CREATE PROCEDURE UpdateBooks
@name AS NVARCHAR(60),
@id as int
AS 
BEGIN
UPDATE Books SET Name=@name
WHERE Id=@id
END

 先在数据库中执行该存储过程,然后要调用该存储过程,我们使用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。执行结果如下:

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

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

示例代码下载地址:点此下载

到此这篇关于Entity Framework使用Code First模式管理存储过程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: EntityFramework使用CodeFirst模式管理存储过程

本文链接: https://www.lsjlt.com/news/141418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • EntityFramework使用CodeFirst模式管理存储过程
    在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand。为了从存储过程中读取很多数据行,我们只需要...
    99+
    2024-04-02
  • EntityFramework使用CodeFirst模式管理视图
    一、什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化。因此,可以将视图看成是一个原生...
    99+
    2024-04-02
  • EntityFramework使用CodeFirst模式管理事务
    一、什么是事务 处理以数据为中心的应用时,另一个重要的话题是事务管理。ADO.NET为事务管理提供了一个非常干净和有效的API。因为EF运行在ADO.NET之上,所以EF可以使用AD...
    99+
    2024-04-02
  • EntityFramework使用CodeFirst模式管理数据库
    一、管理数据库连接 1、使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会...
    99+
    2024-04-02
  • Entity Framework怎么使用Code First模式管理存储过程
    这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framewo...
    99+
    2023-06-29
  • MYSQL中怎么管理存储过程
    今天就跟大家聊聊有关MYSQL中怎么管理存储过程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。查看存储过程函数名:存储过程:(注意字段name,ty...
    99+
    2024-04-02
  • MySQL存储过程使用的参数有哪些不同模式?
    参数使存储过程更加有用和灵活。在MySQL中,我们有以下三种模式 - IN模式它是默认模式。当我们在存储过程中定义IN参数时,调用程序必须将参数传递给存储过程。 IN 参数的值受到保护,这意味着即使 IN 参数的值在存储过程内也会发生更改;...
    99+
    2023-10-22
  • MySQL存储过程的创建、调用与管理详解
    目录存储过程简介为什么要用存储过程?存储过程的优点存储过程的缺点 MySQL 中的存储过程创建与调用过程存储过程语法解析存储过程的参数变量变量赋值流程控制语句if 条件语句case ...
    99+
    2024-04-02
  • 存储管理:优化你的存储使用情况
    优化存储使用情况的最佳实践 存储管理对于任何组织而言都是至关重要的,因为它可以优化存储使用情况,降低成本,提高性能并确保数据的安全性。通过实施以下最佳实践,企业可以充分利用其存储资源: 1. 容量规划: 容量规划涉及预测未来的存储需求并...
    99+
    2024-02-18
    存储管理 存储优化 存储成本 存储性能 数据安全性
  • 如何使用hive存储过程
    这篇文章给大家分享的是有关如何使用hive存储过程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。hive存储过程简介1.x版本的hive中没有提供类似存储过程的功能,使用Hive做数据开发时候,一般是将一段一段的...
    99+
    2023-06-02
  • Springmvc调用存储过程,并返回存储过程返还的数据方式
    目录Springmvc调用存储过程,并返回存储过程返还的数据实现如下这里要重点说明一下Springmvc调用存储过程,entity文件写法Springmvc调用存储过程,并返回存储过...
    99+
    2024-04-02
  • MySQL存储过程:高效管理数据库操作
    MySQL存储过程:高效管理数据库操作 MySQL存储过程是一种预先编译并存储在数据库服务器中的一段SQL语句集,可以被多次调用执行,方便管理和提高数据库操作效率。通过存储过程,可以减...
    99+
    2024-03-14
    mysql 数据库操作 存储过程 sql语句
  • OneFlow源码解析之Eager模式下Tensor存储管理
    目录1不同Tensor类型的存储管理方式2Tensor 存储相关类的关系3通过虚拟机指令为 Tensor 分配存储3.1 存储相关对象的构造3.2 在指令执行过程中分配 tensor...
    99+
    2023-05-16
    OneFlow Eager Tensor Tensor存储管理
  • MySQL中怎么使用存储过程
    MySQL中怎么使用存储过程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 mysql存储过程存储过程(Stored  P...
    99+
    2024-04-02
  • oracle中如何使用存储过程
    这期内容当中小编将会给大家带来有关oracle中如何使用存储过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 1.基本结构 CREATE OR REPLAC&...
    99+
    2024-04-02
  • php+mysql如何使用存储过程
    这篇文章主要介绍“php+mysql如何使用存储过程”,在日常操作中,相信很多人在php+mysql如何使用存储过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php+my...
    99+
    2023-04-19
    mysql php
  • MyBatis中怎么使用存储过程
    在 MyBatis 中使用存储过程可以通过以下步骤实现: 定义存储过程:首先在数据库中定义存储过程,可以使用 SQL 来创建存储...
    99+
    2024-05-08
    MyBatis
  • 使用MySQL存储过程的优点
    本篇内容主要讲解“使用MySQL存储过程的优点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用MySQL存储过程的优点”吧! 1. 使用存储过程的优...
    99+
    2024-04-02
  • MySQL中如何使用存储过程
    这篇文章将为大家详细讲解有关MySQL中如何使用存储过程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用CallableStatemen...
    99+
    2024-04-02
  • oracle中存储过程如何使用
    今天就跟大家聊聊有关oracle中存储过程如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一. 使用for循环游标:遍历所有职位为经理的雇员1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作