实体框架(Entity Framework)是微软推出的一个对象关系映射(ORM)框架,它允许开发人员以面向对象的方式操作数据库。存储过程(Stored Procedure)是预先编译并存储在数据库中的一组SQL语句,可以接受参数、执行操作并返回结果。
在实体框架中使用存储过程主要有两种方式:
// 假设有一个名为GetCustomerOrders的存储过程
// 1. 在EDMX设计器中右键→"从数据库更新模型"
// 2. 选择存储过程→完成
// 3. 右键存储过程→"添加函数导入"
// 使用示例
using (var context = new YourDbContext())
{
var customerIdParameter = new ObjectParameter("CustomerID", 1);
var orders = context.GetCustomerOrders(customerIdParameter).ToList();
foreach (var order in orders)
{
Console.WriteLine($"Order ID: {order.OrderID}, Date: {order.OrderDate}");
}
}
using (var context = new YourDbContext())
{
var customerId = 1;
var orders = context.Database.SqlQuery<OrderDTO>(
"EXEC GetCustomerOrders @CustomerID",
new SqlParameter("CustomerID", customerId)
).ToList();
}
解决方案:
using (var context = new YourDbContext())
{
// 使用DbDataReader处理多个结果集
var cmd = context.Database.Connection.CreateCommand();
cmd.CommandText = "EXEC GetCustomerAndOrders @CustomerID";
cmd.Parameters.Add(new SqlParameter("CustomerID", 1));
context.Database.Connection.Open();
var reader = cmd.ExecuteReader();
// 第一个结果集:客户信息
var customers = ((IObjectContextAdapter)context)
.ObjectContext
.Translate<Customer>(reader, "Customers", MergeOption.AppendOnly);
// 移动到下一个结果集
reader.NextResult();
// 第二个结果集:订单信息
var orders = ((IObjectContextAdapter)context)
.ObjectContext
.Translate<Order>(reader, "Orders", MergeOption.AppendOnly);
context.Database.Connection.Close();
}
解决方案:
using (var context = new YourDbContext())
{
var totalCountParam = new SqlParameter
{
ParameterName = "@TotalCount",
SqlDbType = SqlDbType.Int,
Direction = ParameterDirection.Output
};
var results = context.Database.SqlQuery<Order>(
"EXEC GetOrdersByDateRange @StartDate, @EndDate, @TotalCount OUTPUT",
new SqlParameter("@StartDate", DateTime.Today.AddDays(-7)),
new SqlParameter("@EndDate", DateTime.Today),
totalCountParam
).ToList();
int totalCount = (int)totalCountParam.Value;
Console.WriteLine($"Total orders: {totalCount}");
}
在EF Core中,直接执行SQL是主要方式:
// EF Core示例
using (var context = new YourDbContext())
{
var orders = context.Orders
.FromSqlRaw("EXEC GetCustomerOrders @CustomerID",
new SqlParameter("CustomerID", 1))
.ToList();
}
通过合理使用实体框架中的存储过程,可以在保持代码整洁的同时获得数据库操作的性能优势。