Исключение При использовании хранимой процедуры для вставки записи с использованием Entity Framework - PullRequest
0 голосов
/ 09 декабря 2011

Я пытался понять, почему я получаю исключение, когда пытаюсь использовать зачистную процедуру для вставки записи. У меня есть таблица компании в базе данных со столбцами 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

1 Ответ

1 голос
/ 09 декабря 2011

Посмотрите на это . Вы не можете использовать SCOPE_IDENTITY для гидов. Если ваш первичный ключ кластеризован на GUID, этот также может быть неправильным .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...