2026-06-26 C# Entity Framework 有支援 PL/SQL 或是 stored procedure?

2026-06-26 C# Entity Framework 有支援 PL/SQL 或是 stored procedure?

我:
Entity Framework 有支援 PL/SQL 或是 stored procedure?

GPT:
是的,Entity Framework(EF)支援 PL/SQL 和 stored procedure。雖然 EF 的核心設計是針對簡化的 ORM 操作(例如增刪改查)來映射資料庫中的資料,但它也允許透過 stored procedure 來完成複雜查詢、批次操作以及 PL/SQL 特定的功能需求。

使用 stored procedure 的方法

以下是一些常見的方法來將 stored procedure 與 EF 結合使用:

  1. 以 Entity Framework Core 呼叫 stored procedure
    EF Core 支援以 FromSqlRaw 直接執行 SQL 查詢或 stored procedure,例如:

    1
    2
    3
    var results = context.Employees
    .FromSqlRaw("EXEC GetEmployeesByDepartment @DepartmentId = {0}", departmentId)
    .ToList();

    這裡的 FromSqlRaw 方法會執行 GetEmployeesByDepartment stored procedure,並將結果映射至 Employees 資料模型。

  2. 將 stored procedure 結果映射至模型
    如果 stored procedure 回傳的資料不完全符合現有的資料模型,您可以創建一個 DTO(Data Transfer Object)或自訂類別來接收結果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class EmployeeDto
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
    }

    var employeeDtos = context.EmployeeDtos
    .FromSqlRaw("EXEC GetEmployeesByDepartment @DepartmentId = {0}", departmentId)
    .ToList();
  3. 呼叫 stored procedure 來進行更新、插入或刪除操作
    使用 ExecuteSqlRaw 方法可以執行不返回資料的 stored procedure,常用於進行批量更新或刪除等操作。

    1
    var rowsAffected = context.Database.ExecuteSqlRaw("EXEC UpdateEmployeeSalary @EmployeeId = {0}, @NewSalary = {1}", employeeId, newSalary);
  4. 使用輸入與輸出參數
    若需要使用輸出參數,可以透過 SqlParameter 的方式設定。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var outputParam = new SqlParameter
    {
    ParameterName = "@TotalEmployees",
    SqlDbType = SqlDbType.Int,
    Direction = ParameterDirection.Output
    };

    context.Database.ExecuteSqlRaw("EXEC GetTotalEmployees @DepartmentId = {0}, @TotalEmployees OUT", departmentId, outputParam);

    var totalEmployees = (int)outputParam.Value;

特別考量

由於 PL/SQL 是 Oracle 特有的語法,因此與 SQL Server 的 T-SQL 會有一些差異。當使用 Oracle 的 EF Core provider(例如 Oracle.EntityFrameworkCore)時,需要考慮:

  • 檢查 PL/SQL 中的資料類型是否正確對應 C# 中的資料型別。
  • 確保 stored procedure 或 function 已在 Oracle 中編譯完成並且可以被呼叫。
  • 使用適當的 SqlParameter 來處理輸入和輸出參數。

這樣,Entity Framework 就能成功執行 PL/SQL 的 stored procedure 並有效整合到 C# 應用程式中。

我:
那麼 Entity Framework 要如何 using ? 跟 System.Data 有什麼不同?

GPT:
在 C# 中,Entity FrameworkSystem.Data 都與資料庫操作有關,但它們的作用、使用方式以及理念都有明顯的不同:

1. 使用 Entity Framework (EF)

  • 套件:EF 是一個獨立的 ORM(物件關聯對映)框架,需要安裝相應的 NuGet 套件,例如 Microsoft.EntityFrameworkCore

  • 導入命名空間:在安裝 NuGet 套件後,使用下列命名空間來啟用 EF 的功能:

    1
    using Microsoft.EntityFrameworkCore;
  • 主要目標:EF 的主要功能是將資料庫結構與 C# 類別進行映射,以物件導向的方式操作資料表。您可以使用 LINQ 語法查詢資料庫,而不需要直接撰寫 SQL。

  • 適用場景:EF 適合於使用以 Code-FirstDatabase-First 方法快速建立資料模型,並簡化 CRUD 操作的應用場景。

2. 使用 System.Data

  • 套件System.Data 是 .NET Framework 中提供的基礎資料庫存取命名空間。它包含了低階的 ADO.NET 類別,例如 SqlConnectionSqlCommandDataTable 等,直接支援 SQL 指令的執行。

  • 導入命名空間System.Data 不需要額外安裝,是 .NET 的內建類別庫之一。導入方式如下:

    1
    2
    using System.Data;
    using System.Data.SqlClient; // 針對 SQL Server 特定的連接和命令
  • 主要目標:ADO.NET(隸屬於 System.Data)提供低階、基於連接的資料操作方法,允許您手動管理 SQL 語句,適合需要高度自訂 SQL 查詢或精確控制連接的應用。

  • 適用場景System.Data 適用於進行複雜查詢、批次更新、或對資料庫操作需要極高掌控力的情況,例如大型批次處理或需要細粒度交易管理的系統。

比較

特性 Entity Framework System.Data (ADO.NET)
抽象層級 高:ORM,物件導向 低:直接執行 SQL,手動管理資料庫操作
適合用於 一般的 CRUD 操作,自動化模型管理 複雜查詢,批量操作,精細控制
學習難度 容易:以 C# 語法為主 較難:需手動撰寫 SQL 和管理連接
性能表現 中等:因抽象層較高 快速:低階操作,無額外的 ORM 開銷
使用方式 DbContext 管理模型與資料庫的連接 SqlConnectionSqlCommand 手動控制連接

3. 範例比較

  • Entity Framework(使用 LINQ 查詢):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    using Microsoft.EntityFrameworkCore;

    public class MyDbContext : DbContext
    {
    public DbSet<Employee> Employees { get; set; }
    }

    var context = new MyDbContext();
    var employees = context.Employees.Where(e => e.Salary > 5000).ToList();
  • System.Data(使用 ADO.NET 查詢):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    using System.Data;
    using System.Data.SqlClient;

    string connectionString = "your_connection_string";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    connection.Open();
    SqlCommand command = new SqlCommand("SELECT * FROM Employees WHERE Salary > 5000", connection);
    SqlDataReader reader = command.ExecuteReader();

    while (reader.Read())
    {
    Console.WriteLine(reader["Name"]);
    }
    }

總結

如果專案主要需要快速進行資料操作,並且表結構相對穩定,Entity Framework 會是更高效、可讀性更高的選擇;而如果專案需要直接操控資料庫結構、實施高效批量操作或處理複雜的 SQL 語句,則 System.Data 提供了更多的靈活性。