ef core 3.1中 逆向工程生成实体及常用查询执行原生存储过程

EFcore3.1

 

  1. core3.1在linux安装环境
sudo apt-get update; \ sudo apt-get install -y apt-transport-https && \ sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-

3.1

使用cli安装efcore

dotnet tool install --global dotnet-ef   CLI输入dotnet ef 无效的情况

也可以直接使用pmc也就是包管理工具控制台

下面是pmcDBFirst逆向工程dbfirst生成

 

  1. .net core3.1 efcore(生成实体类) 准备工作:
    1.安装包  (第一种)
  2. Install-Package MySql.Data.EntityFrameworkCore  
    Install-Package Pomelo.EntityFrameworkCore.MySql
    Install-Package Microsoft.EntityFrameworkCore.Tools
    Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

     

 

 

第二种包安装所需引用 :可不选版本号

   

Install-Package Microsoft.EntityFrameworkCore 此单独安装在EF目录项目中引用 替换下面MySql.Data.EntityFrameworkCore 

Install-Package MySql.Data.EntityFrameworkCore (可不用) 因为Pomelo.EntityFrameworkCore.MySql 已经集成

安装MySql.Data.EntityFrameworkCore 容易出现版本不兼容报错!

 

    Install-Package   Microsoft.EntityFrameworkCore  -Version  3.1.5
    Install-Package  Microsoft.EntityFrameworkCore.Relational  -Version  3.1.5(不安装会在api项目中报错缺少引用)
    Install-Package  Microsoft.EntityFrameworkCore.Tools -Version 3.1.5  
    Install-Package  Microsoft.VisualStudio.Web.CodeGeneration.Design  -Version  3.1.3
    Install-Package  NPOI -Version -2.51
    Install-Package   Pomelo.EntityFrameworkCore.MySql -Version 3.11


 


2.执行语句

model实体

若要查看示例,请键入: "get-help Scaffold-DbContext -examples".

有关详细信息,请键入: "get-help Scaffold-DbContext -detailed".

若要获取技术信息,请键入: "get-help Scaffold-DbContext -full".

有关在线帮助,请键入: "get-help Scaffold-DbContext -online"


打开项目文件夹(需要放置实体类和dbcontext文件的地址 ),cmd 执行命令

mysql版本如下:(server=localhost;不能为server=.;)

 

生成命令 PMC 包管理工具(仅限制vs2019使用)

 

Scaffold-DbContext -Connection "server=127.0.0.1;uid=root;pwd=123;database=SlaughterCore;"  -Provider Pomelo.EntityFrameworkCore.MySql -OutputDir Models -ContextDir Db -Context SlaughterContext -Table T_User -UseDatabaseNames  -Force  [覆盖已生成t]

 

sqlserver数据库执行命令:

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

 

以下是执行语句命令解释Scaffold-DbContext "server=localhost;user id=root;password=123;charset=utf8;persistsecurityinfo=True;port=3306;database=SlaughterCore" MySql.Data.EntityFrameworkCore [提供程序名称。 提供程序名称通常与提供程序的 NuGet 包名称相同] -Context【指定上下文名称】 SlaughterContext -ContextDir【要在其中放置实体类文件的目录。 路径相对于项目目录。】 Db -OutputDir【指定输出表视图目录】 Models  -t【要为其生成实体类型的表。 若要指定多个表,请对 -t 每个表重复或 --table 。 如果省略此选项,则包括所有表。】 t_user -UseDatabaseNames【使用表和列的名称与数据库中显示的名称完全相同。 如果省略此选项,则更改数据库名称以更严格地符合 c # 名称样式约定。】 --force【覆盖现有生成文件】  以上为PMC 工具(仅适用于 Visual Studio) 工具即vs自带nuget包控制台

 

以上代码如果执行PMC命令的时候报错如

 

则重新安装 最新版 Install-Package Microsoft.EntityFrameworkCore.Tools

注意:如果报 dotnet ef 无此命令 运行如下代码

 dotnet tool install --global dotnet-ef

官方注释:
-OutputDir *** 实体文件所存放的文件目录
-ContextDir *** DbContext文件存放的目录
-Context *** DbContext文件名
-Schemas *** 需要生成实体数据的数据表所在的模式
-Tables *** 需要生成实体数据的数据表的集合
-DataAnnotations
-UseDatabaseNames 直接使用数据库中的表名和列名(某些版本不支持)
-Force 强制执行,重写已经存在的实体文件

 

  1. 执行原生sql语句及增删改查操作方法:

 

 

 

ef core 3.1中 逆向工程生成实体及常用查询执行原生存储过程_第1张图片

 

ef core 3.1中 逆向工程生成实体及常用查询执行原生存储过程_第2张图片

 

常用执行语句

  1.  Dbset(). FromSql() Dbset(). (返回查询对应实体集合的操作) 只限定DBSet使用
  2.  FromSqlRaw() (执行带有返回值的查询或者存储过程原生sql语句),
  3.  FromSqlInterpolated  借助这个可以

D.  _context.Database.ExecuteSqlRawAsync()  _context.Database.ExecuteSqlRaw() (执行带有增删改查sql 返回执行影响结果行数int返回值)  只能限定DBContext上下文使用此方法

 如果连接和内插的字符串 ($"") 带有用户提供的未经验证的值,则切勿将其传递到 FromSqlRaw 或 ExecuteSqlRaw。 通过 FromSqlInterpolated 和 ExecuteSqlInterpolated 方法,可采用一种能抵御 SQL 注入攻击的方式使用字符串内插语法

  1. 第一种参数传递:

var id= "123" ,name=“andy”

var user= context.User.FromSqlRaw("EXECUTE dbo.GetUserById({0},{1})", id,name).ToList();

虽然 FromSqlInterpolated 类似于 FromSqlRaw,但你可以借助它使用字符串内插语法。 与 FromSqlRaw 一样,FromSqlInterpolated 只能在查询根上使用。 与上述示例一样,该值会转换为 DbParameter,且不易受到 SQL 注入攻击。

B.字符串内插语法

var id= "123" ,name=“andy”

var user=context.User.FromSqlInterpolated(

$"EXECUTE dbo.GetUserById( { id},{name})").ToList();

C 使用SqlParameter传递或者MySqlParmeter

var id= "123" ,name=“andy”

Var sqlpar = new SqlParameter[] { new SqlParameter("@id", "123"), new SqlParameter("@name", "andy") };

var user= context.User.FromSqlRaw(" call dbo.GetUserById(@id,@name)", sqlpar ).ToList();

原文链接:https://blog.csdn.net/andy5520/article/details/106927172

 Efcore3.1  对于efcore中执行存储过程之后分页报错的处理 仅限存储过程或者原生sql语句执行表或者视图不存在此问题!

原因:因为3.1版本不在对linq to sql 做生成sql语句的操作所以

  一般将返回结果进行AsEnumerable()之后分页 或者 ToListAsync() 之后分页 

对于这种 .OrderBy(t => t.userName).ToPageData(HttpContext)  orderby 排序的 也会报错   必须添加到内存中再做查询或者其他操作

  .ToListAsync()).OrderBy(t => t.userName).ToList();

对于OrderBy()排序操作的也必须 ToListAsync() 之后排序

 (await  _context.p_jc_animalCount.FromSqlRaw("call p_jc_animalCount({0},{1},{2},{3});", regionCode.ToTrimRegionCode(HttpContext),beginTime,endTime,ownerType).ToListAsync()).OrderByDescending(t => t.stockCount).ToPageData(HttpContext);

微软官方文档 中断性变更:

https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changes?toc=/dotnet/core/compatibility/toc.jso

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dotnet

https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/scaffolding?tabs=dotnet-core-cli

参考文档: https://docs.microsoft.com/zh-cn/ef/core/querying/raw-sql

 原文链接:https://blog.csdn.net/andy5520/article/details/106927172

 

 

 

 

 

你可能感兴趣的:(EFCore,efcore3.1执行存储过程)