此入門教程是記錄下方參考資料視頻的過程,本例基於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}");
}