首页 > 其他分享 >Entity Framework教程-存储过程、视图、函数(Stored Procedures, Views, and Functions)

Entity Framework教程-存储过程、视图、函数(Stored Procedures, Views, and Functions)

时间:2022-10-20 09:12:58浏览次数:59  
标签:Functions Views 代码 db 存储 视图 migrationBuilder var 过程

更新记录
转载请注明出处:
2022年10月20日 发布。
2022年10月10日 从笔记迁移到博客。

存储过程(Stored Procedures)

在EFCore中定义存储过程

直接调用sql命令定义存储过程和移除存储过程

using(PandaDbContext db = new PandaDbContext())
{
    //创建存储过程
    db.Database.ExecuteSqlRaw("创建存储过程的T-SQL代码");
    //移除存储过程
    db.Database.ExecuteSqlRaw("移除存储过程的T-SQL代码");
}

在EF Core 的Migrations中的迁移文件中定义迁移代码

具体的代码在Up和Down方法中定义即可

这样的好处是可以利用EF Core的迁移功能管理代码的版本

public partial class init2 : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        //创建存储过程的代码,用于创建存储过程使用
        migrationBuilder.Sql(@"创建存储过程的T-SQL代码");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        //删除存储过程的代码,用于回滚使用
        migrationBuilder.Sql("移除存储过程的T-SQL代码");
    }
}

实例:

protected override void Up(MigrationBuilder migrationBuilder)
{
    //第一个存储过程的创建代码
    var proc1 = @"
    IF OBJECT_ID('GetPersonsByState', 'P') IS NOT NULL
    DROP PROC UpdateProfilesCountry
    GO
    CREATE PROCEDURE [dbo].[GetPersonsByState]
        @State varchar(255)
    AS
    BEGIN
        SELECT p.*
        FROM Persons p
        INNER JOIN Addresses a on p.Id = a.PersonId
        WHERE a.State =  @State
    END";

    //第二个存储过程的创建代码
    var proc2 = @"
    IF OBJECT_ID('AddLookUpItem', 'P') IS NOT NULL
    DROP PROC AddLookUpItem
    GO
    CREATE PROCEDURE [dbo].[AddLookUpItem]
        @Code varchar(255),
        @Description varchar(255),
        @LookUpTypeId int
    AS
    BEGIN
        INSERT INTO LookUps (Code, Description, LookUpType) VALUES (@Code, @Description, @LookUpTypeId)
    END";

    //执行定义第1个创建存储过程的代码
    migrationBuilder.Sql(proc1);
    //执行定义第2个创建存储过程的代码
    migrationBuilder.Sql(proc2);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
    //删除存储过程
    migrationBuilder.Sql(@"DROP PROC GetPersonsByState");
    //删除存储过程
    migrationBuilder.Sql(@"DROP PROC AddLookUpItem");
}

在EF Core中使用执行存储过程

直接使用T-SQL调用存储过程

执行存储过程(返回指定的实体类型)(无参数形式)

var result2= dbContext.Posts.FromSqlRaw("EXEC [dbo].[GetLatestNews]");

执行存储过程(返回指定的实体类型)(有参数形式)(简单参数形式)

int id = 666;
var result = dbContext.Posts
  .FromSqlRaw("EXEC [dbo].[GetBlogs] @categoryId = {0}", id)
  .ToList();

执行存储过程(返回指定的实体类型)(有参数形式)(参数绑定形式)

int id = 666;
var result = dbContext.Posts
   .FromSqlRaw("EXEC [dbo].[GetBlogs] @categoryId = @Id", new SqlParameter("id", id))
    .ToList();

执行存储过程(返回指定的实体类型)(有参数形式)(参数绑定形式)(多参数)

int id = 666;
var result = dbContext.Posts
   .FromSqlRaw("EXEC [dbo].[GetBlogs] @categoryId = @Id", new{ id })
    .ToList();

实例:

using(PandaDbContext db = new PandaDbContext())
{
   //调用没有返回值的存储过程!!!
   int v = db.Database.ExecuteSqlRaw("调用存储过程的代码");
   int v = db.Database.ExecuteSqlRaw("调用存储过程的代码",参数parameter[]);
   
//调用返回指定表对应Model的存储过程!!!
   var reuslt = db.Products.FromSqlRaw("T-SQL代码");
   var reuslt = db.Products.FromSqlRaw("T-SQL代码",参数parameter[]);
}

使用Fluent API将存储过程的结果映射结果集实体

为了能够将结果映射到结果集,需要先建立一个结果集Model来表示结果集的形

public class GetItemsForListingDto
{
    public string Name { get; set; } = "";
    public string Description { get; set; } = "";
    public string Notes { get; set; } = "";
}

然后添加到DbContext中

public DbSet<GetItemsForListingDto> ItemsForListing { get; set; }
在DbContext中的OnModelCreating方法中使用Fluent API添加描述
modelBuilder.Entity<GetItemsForListingDto>(x =>
{
    x.HasNoKey();
    x.ToView("ItemsForListing");
});

查询数据使用原始的T-SQL

var minDate = new SqlParameter("minDate", new DateTime(2020, 1, 1));
var maxDate = new SqlParameter("maxDate", new DateTime(2021, 1, 1));
var results = db.ItemsForListing.FromSqlRaw("EXECUTE dbo.GetItemsForListing @minDate, @maxDate", minDate, maxDate)

函数(Functions)

在EF Core中使用 函数 基本 和 存储过程 相同

视图(Views)

在EF Core中使用视图基本 和 存储过程 相同

标签:Functions,Views,代码,db,存储,视图,migrationBuilder,var,过程
From: https://www.cnblogs.com/cqpanda/p/16797936.html

相关文章

  • MySQL 视图创建(跨数据库)
    格式CREATEVIEW视图所在库库名.视图名AS(SELECT表所在库库名.表名.列名AS新列名...FROM表所在库库名.表名);注意:数据库必须是在同一台服务器上,两个数据......
  • SpringMVC的视图
    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC视图的种类很多,默认有转发视图和重定向视图当工程引入jstl的依赖,转发视图会自动......
  • drf之请求与响应、drf之视图组件、2个视图基类
    drf之请求与响应Requestfromrest_framework.requestimportRequestdef__init__(self,request,parsers=None,authenticators=None,negotiat......
  • drf--ViewSet
    ViewSet实现cbv模式指定请求对应函数,函数里面可以放get的多个方法等urls.pyfromdjango.urlsimportpath,re_pathurlpatterns=[#^:匹配字符串开头,#$:匹配......
  • 数据库新增表后,EF通过数据库更新模型后,在视图中已经新表,但在Model 中没有出现Mode实体
    新建表t_PtoductMini, 执行Scaffold-DbContext"DataSource=.;InitialCatalog=XXX;IntegratedSecurity=True"Microsoft.EntityFrameworkCore.SqlServer-OutputDirM......
  • manim functions
    manimCE#manimCEiftype('manimCE')==str:#self.play()defsp(*args,**kwargs):returnself.pl......
  • 多媒体——视频——利用视频视图VideoView播放视频
                                      =====================================================......
  • DEMO:表维护视图相关维护及调用
    新建一个数据库表设置成可维护这里可以se11创建表维护视图也可以直接在刚才的界面点新建即可。另外,表字段里有时间和日期。想在创建和修改行项目的时候,日期和时间字段自动填......
  • 数据库第十次作业-视图【带源码】
    目录​​1.创建视图“view_info”,查询所有员工姓名、员工联系电话、车间地址、车间主任姓名、主任联系方式​​​​2.查看“view_info”视图字段信息​​​​3.创建视图“v......
  • 第八周 项目5:创建与使用视图
    目录​​一、课堂内容​​​​1.创建视图​​​​2.使用视图​​​​3.删除视图​​​​4.查看视图字段信息​​​​5.查看视图创建信息​​​​6.修改视图​​​​7.创建或......