Entity Framework Core 3.1 入门(七)执行原生SQL语句
此入门教程是记录下方参考资料视频的过程,本例基于Entity Framework Core 3.1
开发工具:Visual Studio 2019
目录
Entity Framework Core 3.1 入门(八)在 ASP.NET Core 中配置 Entity Framework Core
创建视图和存储过程
EF Core不能直接操作数据库,所以要创建视图和存储过程,需要使用生成的空的Migration文件,将执行的SQL脚本放到Migration文件里,Up()和Down()方法
无主键的Entity
- .NET Core 3.1 允许无主键的Entity
- 它们不会被追踪
- 映射到没有主键的Table或View
- 查询时不能使用Find(),因为Find()使用主键
public DbSet<PlayerClub> PlayerClubs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//ToView(),参数是视图名,将DbSet映射到(已存在的)视图上
modelBuilder.Entity<PlayerClub>()
.HasNoKey()
.ToView("PlayerClubView");
}
原生SQL查询的要求
- 必须返回Entity类型的所以(标量)属性,(SELECT *)
也可以写变量,但是一个不能多一个不能少,不能写导航属性 - 字段名和Entity的属性名匹配
- 无法包含关联的数据(SQL语句中)
- 只能查询已知的Entity
原生SQL查询(方法在DbSet上)
- FromSqlRaw("SELECT * ...")
- FromSqlRawAsync("SELECT * ...")
C# 6.0 的插值语法必须使用以下函数才能用 - FromSqlInterpolated($"SELECT * WHERE x={var}")
- 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上)
- Context.Database.ExecuteSqlRaw()
- Context.Database.ExecuteSqlRawAsync()
- Context.Database.ExecuteSqlInterpolated()
- Context.Database.ExecuteSqlInterpolatedAsync()
- 无法用于查询
- 只能返回影响的行数
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}");
}