Это буквально вся моя транзакция:
adc.BeginTransaction();
// create/edit quote assocated with quote request
adc.CreateOrEditQuote(model.QuoteRequestID, model.Amount);
adc.CommitTransaction();
Я нигде не вижу, чтобы у меня лежало открытое DataReader
, которое могло бы мешать чему-либо еще - внутрисделка!У меня есть еще один вызов базы данных в другом классе, который должен быть завершен к тому времени, когда он будет вызван:
var model = new ViewQuoteRequestModel();
var qr = DataContextProvider.REDACTED.ListQuoteRequests().SingleOrDefault(q => q.QuoteRequestID == id);
if (null != qr)
{
qr.CopyTo<IViewQuoteRequestModel>(model);
}
return model;
Вызов SingleOrDefault
для моих данных должен разрешать их, а не оставлять их отложенно загруженными, верно?Так что это не должно быть проблемой в любом случае ...
edit: если я закомментирую строку, где я вызываю CreateOrEditQuote
, то ошибки не будет, но, конечно, данные не сохраняются.Так что в случае, если это поможет, вот моя хранимая процедура:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[REDACTED].[CreateOrEditQuote]') AND type in (N'P', N'PC'))
DROP PROCEDURE [REDACTED].[CreateOrEditQuote]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [REDACTED].[CreateOrEditQuote]
(
@QuoteRequestID int,
@Amount money
)
as
begin
declare @qid int
select @qid = QuoteID from QuoteRequest where ID = @QuoteRequestID
if @qid is null
begin
-- quote does not exist, create it
insert into quote (Amount) values (@Amount)
select @qid = @@IDENTITY
end
else
begin
-- quote exists, edit it
update quote set Amount = @Amount where ID = @qid
end
update QuoteRequest set QuoteID = @qid where ID = @QuoteRequestID
select @qid as QuoteID
end
GO
Странная вещь, если я запускаю хранимую процедуру вручную через SQL Server Management Studio, она запускается, но если я делаю это через свое веб-приложение(вызывая код, которым я поделился в верхней части моего поста), он падает ...