目前EF Core調用存儲過程,限制不少,好比返回結果必須是定義好的DbSet<>等等。這裏用一種曲線救國的方式,自定義兩個方法,用原始ado.net解決問題。以MySql數據庫爲例,代碼以下:數據庫
1 namespace WebApi.Core.Data 2 { 3 using System.Data; 4 using System.Linq; 5 6 using Microsoft.EntityFrameworkCore; 7 8 using MySql.Data.MySqlClient; 9 10 public class TestContext : DbContext 11 { 12 public TestContext(DbContextOptions<TestContext> options) 13 : base(options) 14 { 15 } 16 17 public int ExcuteProcedure(string parcedureName, params MySqlParameter[] ps) 18 { 19 using (var cmd = this.Database.GetDbConnection().CreateCommand()) 20 { 21 cmd.CommandText = parcedureName; 22 cmd.CommandType = CommandType.StoredProcedure; 23 cmd.Parameters.AddRange(ps); 24 this.Database.OpenConnection(); 25 var r = cmd.ExecuteNonQuery(); 26 this.Database.CloseConnection(); 27 return r; 28 } 29 } 30 31 public object ExcuteFunction(string functionName, params MySqlParameter[] ps) 32 { 33 using (var cmd = this.Database.GetDbConnection().CreateCommand()) 34 { 35 // 參數字符串,傳參時注意順序 36 var pString = 37 $"'{ps.Aggregate(string.Empty, (c, n) => $"{c}','{n.Value}").TrimStart(new[] { ',', '\'' })}'"; 38 39 // 可用this.Database.IsXXX(),判讀數據庫類型,拼command字符串,這裏不寫了 40 cmd.CommandText = $"select {functionName}({pString});"; 41 this.Database.OpenConnection(); 42 var r = cmd.ExecuteScalar(); 43 this.Database.CloseConnection(); 44 return r; 45 } 46 } 47 48 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 49 { 50 } 51 } 52 }