Я пытался понять, почему я получаю исключение, когда пытаюсь использовать зачистную процедуру для вставки записи. У меня есть таблица компании в базе данных со столбцами Id (Guid), Name (nvarchar) и timestamp (datetime). Столбец Id - это RowGuid. Также я использую SQL Server 2005 и EF4
Хранимая процедура
ALTER PROCEDURE [dbo].[InsertCompanySP]
@companyName NVarChar(50),
@timeStamp datetime
AS
BEGIN
SET NOCOUNT ON;
Insert into dbo.Company(Name,TimeStamp) values (@companyName, @timeStamp)
select SCOPE_IDENTITY() as Id
END
код, который я использую для вызова этой хранимой процедуры:
using (var context = new testEntities())
{
try
{
Company c = new Company();
c.Name = "abcd";
c.TimeStamp = DateTime.Now;
context.Companies.AddObject(c);
context.SaveChanges();
Console.WriteLine(c.Id);
}
catch (Exception ex)
{
Console.WriteLine("Exception Occurred");
}
}
Как вы можете догадаться, в хранимой процедуре вставки модели Entity Framework сопоставление companyName и timeStamp связано со свойствами Name и TimeStamp моей компании, а Id - со свойством Id компании. Если я иду дальше и удаляю привязку столбца результата, все работает нормально (хранимая процедура вызывается, и исключение не выдается). Когда у меня есть привязка результата для возврата идентификатора добавленной компании, я все еще вижу, как вызывается та же самая хранимая процедура, но она выдает исключение, говорящее
"Возвращено значение, сгенерированное нулевым хранилищем, для ненулевого элемента 'Id' типа 'testModel.Company'."
Я предполагаю, что у меня может быть что-то неправильное в моей хранимой процедуре с возвратом идентификатора вставленной строки, но я не могу понять это. Я также попытался использовать следующее в хранимой процедуре для возврата значения вставленного идентификатора компании, но я все еще получаю то же исключение
select Id = @@IDENTITY
ОБНОВЛЕНИЕ: я забыл упомянуть, что Id также помечен StoreGeneratedPattern = Identity в EF
ОБНОВЛЕНИЕ: я решил проблему благодаря @olivehour .. изменил мою хранимую процедуру до
ALTER PROCEDURE [dbo].[InsertCompanySP]
@companyName NVarChar(50),
@timeStamp datetime
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TmpTable TABLE (Id uniqueidentifier);
Insert into dbo.Company(Name,TimeStamp)
OUTPUT INSERTED.Id INTO @TmpTable
values (@companyName, @timeStamp)
select Id from @TmpTable
END