У меня проблема при выполнении хранимой процедуры внутри открытой транзакции в Entity Framework.
Проблема в том, что (посмотрите на код), когда я выполняю хранимую процедуру p_RecalcCost, возвращаемое значение верное,но значение в базе данных не изменится.
Это позволяет мне думать, что операция обновления, выполненная в хранимой процедуре, находится за пределами моей транзакции.
Есть идеи?
public bool myMethod(Entities ctx=null)
{
bool ok = true;
var context = ctx == null ? new Entities() : ctx;
var dbTran = context.Database.CurrentTransaction ?? context.Database.BeginTransaction();
List<MyObject> rows= MyObject.getRows(id, context);
foreach (MyObject ier in rows)
{
MyObject oldObj = MyObject.GetEntity(ier.ID,context);
decimal oldCost = oldObj.Cost;
System.Data.Entity.Core.Objects.ObjectParameter myOutputParamDecimal = new System.Data.Entity.Core.Objects.ObjectParameter("CostRes", typeof(decimal));
context.p_RecalcProductCost(ier.ID, myOutputParamDecimal);
context.SaveChanges();
decimal newCost = Convert.ToDecimal(myOutputParamDecimal.Value);
}
....ok is always true
if (ctx == null)
{
if (ok)
dbTran.Commit();
else
dbTran.Rollback();
context.Dispose();
}
return ok;
}
Здесь код хранимой процедуры
CREATE PROCEDURE [dbo].[p_RecalcProductCost]
@ID_Product int null,
@CostRes decimal(10,2) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET FMTONLY OFF;
SELECT TOP 1 @CostRes=100 --is an example, this is a result of operations
--update cost on table Product
UPDATE Product set Cost = @CostRes
WHERE (@ID_Product IS NULL OR (@ID_Product is not null AND ID_Product = @ID_Product))
--update cost on another table
UPDATE ProductSupplier
SET ps.Cost = CostRes
WHERE
(@ID_Product IS NULL OR (@ID_Product is not null AND ps.ID_Product = @ID_Product))
END
Если в DEBUG после сохраненного выполнения я делаю выборку в БД с УРОВНЕМ ИЗОЛЯЦИИ СДЕЛОК СЧИТЫВАНИЯ, ЧТО НЕОБХОДИМО, Стоимость равна 100, но когда транзакциязаканчивается стоимость на БД равна NULL.