對應的預存程序之應用程式程式碼 (Entity Framework)
本章節的應用程式程式碼說明 Entity Framework 使用更新資料的預存程序 (Stored Procedure) 之方式。預存程序支援 (Entity Framework) 說明範例所使用的物件模型和預存程序。
當預存程序定義於儲存區結構描述且對應於對應規格時,便會以隱含方式呼叫預存程序。不論您是否有使用資料模型中的預存程序,建立、更新和刪除實體所用的程式碼順序都相同。
使用預存程序建立實體
下列範例會建立新的 SalesOrderDetail 實體,並將它插入儲存區。
SalesOrderDetail newSODetail = new SalesOrderDetail();
newSODetail.CarrierTrackingNumber = "4E0A-4F89-AE";
newSODetail.ModifiedDate = DateTime.Now;
newSODetail.SpecialOfferID = 1;
newSODetail.rowguid = Guid.NewGuid();
newSODetail.UnitPrice = 45.00M;
newSODetail.OrderQty = 5;
newSODetail.ProductID = 680;
objCtx.AddToSalesOrderDetails(newSODetail);
ObjectParameter par = new ObjectParameter("p", 45678);
SalesOrderHeader soHeader =
objCtx.SalesOrderHeader.Where("it.SalesOrderID = @p", par).First<SalesOrderHeader>();
soHeader.SalesOrderDetail.Add(newSODetail);
objCtx.SaveChanges();
使用預存程序修改實體
下列程式碼會修改 SalesOrderDetail 實體的訂單數量屬性。
ObjectParameter par2 = new ObjectParameter("p", 45678);
SalesOrderHeader soHeader2 =
objCtx.SalesOrderHeader.Where("it.SalesOrderID = @p", par2).First<SalesOrderHeader>();
soHeader2.SalesOrderDetail.Load();
foreach (SalesOrderDetail sodet in soHeader2.SalesOrderDetail)
{
Console.WriteLine(sodet.SalesOrderDetailID + " Prod: " +
sodet.ProductID + " Qty: " + sodet.OrderQty);
if (sodet.ProductID.Equals(680))
{
sodet.OrderQty = 6;
objCtx.SaveChanges();
break;
}
}
使用預存程序刪除實體
下列程式碼會使用預存程序刪除 SalesOrderDetail 實體。
ObjectParameter par2 = new ObjectParameter("p", 45678);
SalesOrderHeader soHeader2 =
objCtx.SalesOrderHeader.Where("it.SalesOrderID = @p",
par2).First<SalesOrderHeader>();
soHeader2.SalesOrderDetail.Load();
foreach (SalesOrderDetail sodet in soHeader2.SalesOrderDetail)
{
Console.WriteLine(sodet.SalesOrderDetailID +
" Prod: " + sodet.ProductID + " Qty: " +
sodet.OrderQty);
if (sodet.ProductID.Equals(680))
{
objCtx.DeleteObject(sodet);
objCtx.SaveChanges();
break;
}
}
完整的應用程式程式碼
下列範例包含本章節中的所有範例。請在建立新 SalesOrderDetail
實體的程式碼區塊執行過一次之後,將該區塊標記為註解。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdventureWorksModel;
using System.Data.Objects;
namespace AdvWksSalesSProcsClient
{
class Program
{
static void Main(string[] args)
{
using (AdventureWorksEntities objCtx = new AdventureWorksEntities())
{
SalesOrderDetail newSODetail = new SalesOrderDetail();
newSODetail.CarrierTrackingNumber = "4E0A-4F89-AE";
newSODetail.ModifiedDate = DateTime.Now;
newSODetail.SpecialOfferID = 1;
newSODetail.rowguid = Guid.NewGuid();
newSODetail.UnitPrice = 45.00M;
newSODetail.OrderQty = 5;
newSODetail.ProductID = 680;
objCtx.AddToSalesOrderDetails(newSODetail);
ObjectParameter par = new ObjectParameter("p", 45678);
SalesOrderHeader soHeader =
objCtx.SalesOrderHeader.Where("it.SalesOrderID = @p",
par).First<SalesOrderHeader>();
soHeader.SalesOrderDetail.Add(newSODetail);
objCtx.SaveChanges();
ObjectParameter par2 = new ObjectParameter("p", 45678);
SalesOrderHeader soHeader2 =
objCtx.SalesOrderHeader.Where("it.SalesOrderID = @p",
par2).First<SalesOrderHeader>();
soHeader2.SalesOrderDetail.Load();
foreach (SalesOrderDetail sodet in soHeader2.SalesOrderDetail)
{
Console.WriteLine(sodet.SalesOrderDetailID +
" Prod: " + sodet.ProductID + " Qty: " + sodet.OrderQty);
if (sodet.ProductID.Equals(680))
{
objCtx.DeleteObject(sodet);
objCtx.SaveChanges();
break;
}
}
foreach (SalesOrderDetail sodet in soHeader2.SalesOrderDetail)
{
Console.WriteLine(sodet.SalesOrderDetailID +
" Prod: " + sodet.ProductID +
" Qty: " + sodet.OrderQty);
if (sodet.ProductID.Equals(680))
{
sodet.OrderQty = 6;
objCtx.SaveChanges();
break;
}
}
}
}
}
}
另請參閱
工作
HOW TO:使用預存程序執行查詢 (Entity Framework)
HOW TO:定義具有預存程序的模型 (Entity Framework)
概念
預存程序支援 (Entity Framework)
AdventureWorks Sales Model (EDM)
將關聯集對應至預存程序 (Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)