Entity Framework Core 3.1 入门(七)执行原生SQL语句

此入门教程是记录下方参考资料视频的过程,本例基于Entity Framework Core 3.1
开发工具:Visual Studio 2019

参考资料:https://www.bilibili.com/video/BV1xa4y1v7rR

目录

Entity Framework Core 3.1 入门(一)创建项目

Entity Framework Core 3.1 入门(二)创建数据库和迁移(Migration)文件

Entity Framework Core 3.1 入门(三)一对一、多对多

Entity Framework Core 3.1 入门(四)增删改查

Entity Framework Core 3.1 入门(五)关联数据的添加和查询

Entity Framework Core 3.1 入门(六)一对一和多对多关系的增删改查

Entity Framework Core 3.1 入门(七)执行原生SQL语句

Entity Framework Core 3.1 入门(八)在 ASP.NET Core 中配置 Entity Framework Core

创建视图和存储过程

EF Core不能直接操作数据库,所以要创建视图和存储过程,需要使用生成的空的Migration文件,将执行的SQL脚本放到Migration文件里,Up()和Down()方法

无主键的Entity

  1. .NET Core 3.1 允许无主键的Entity
  2. 它们不会被追踪
  3. 映射到没有主键的Table或View
  4. 查询时不能使用Find(),因为Find()使用主键
public DbSet<PlayerClub> PlayerClubs { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      //ToView(),参数是视图名,将DbSet映射到(已存在的)视图上
      modelBuilder.Entity<PlayerClub>()
            .HasNoKey()
            .ToView("PlayerClubView");
}

原生SQL查询的要求

  1. 必须返回Entity类型的所以(标量)属性,(SELECT *)
      也可以写变量,但是一个不能多一个不能少,不能写导航属性
  2. 字段名和Entity的属性名匹配
  3. 无法包含关联的数据(SQL语句中)
  4. 只能查询已知的Entity

原生SQL查询(方法在DbSet上)

  1. FromSqlRaw("SELECT * ...")
  2. FromSqlRawAsync("SELECT * ...")
    C# 6.0 的插值语法必须使用以下函数才能用
  3. FromSqlInterpolated($"SELECT * WHERE x={var}")
  4. FromSqlInterpolatedAsync($"SELECT * WHERE x={var}")

执行原生SQL查询语句

public static void Func_26()
{
      using var context = new DemoContext();
      //FromSqlRaw()是DbSet的方法
      //ToList()才会去查数据库
      var leagues = context.Leagues.FromSqlRaw("SELECT * FROM dbo.Leagues").ToList();

      //条件查询
      //var clubs = context.Clubs
      //    .FromSqlRaw("SELECT * FROM dbo.Clubs WHERE Id>0")
      //    .Include(x => x.League)
      //    .Include(x => x.Players)
      //        .ThenInclude(x => x.GamePlayers)
      //    .ToList();

      //字符串插值(带参数SQL语句)
      var clubs = context.Clubs
          .FromSqlInterpolated($"SELECT * FROM dbo.Clubs WHERE Id>{0}").ToList();

      //执行查询的存储过程
      //FromSqlRaw()和FromSqlInterpolated()都行,但是返回的字段必须和类匹配
      var data = context.Clubs
          .FromSqlInterpolated($"EXEC dbo.Xxxx WHERE Id>{0}").ToList();
}

执行非查询类SQL(方法不在DbSet上)

  1. Context.Database.ExecuteSqlRaw()
  2. Context.Database.ExecuteSqlRawAsync()
  3. Context.Database.ExecuteSqlInterpolated()
  4. Context.Database.ExecuteSqlInterpolatedAsync()
  5. 无法用于查询
  6. 只能返回影响的行数
public static void Func_27()
{
      using var context = new DemoContext();

      //一定要用带参数SQL语句,防止SQL注入
      var count = context.Database.ExecuteSqlRaw("EXEC dbo.RemoveGamePlayersProcedure {0}", 2);

      count = context.Database.ExecuteSqlInterpolated($"EXEC dbo.RemoveGamePlayersProcedure {2}");
}

执行原生SQL语句 结束

posted @ 2021-02-04 15:59  .NET好耶  阅读(1653)  评论(0编辑  收藏  举报