Код приложения для сопоставляемых хранимых процедур (платформа Entity Framework)
Приведенный в этом разделе код приложения иллюстрирует использование обновляющих данные хранимых процедур на платформе Entity Framework. Модель объектов и хранимые процедуры, используемые в этом примере, описаны в разделе Поддержка хранимых процедур (платформа 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;
}
}
}
}
}
}
См. также
Задачи
Как выполнить запрос с помощью хранимой процедуры (платформа Entity Framework)
Как определить модель с помощью хранимой процедуры (платформа Entity Framework)
Основные понятия
Поддержка хранимых процедур (платформа Entity Framework)
Модель AdventureWorks Sales (модель EDM)
Сопоставление набора ассоциаций с хранимыми процедурами (платформа Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)