Как мне вернуть int из хранимой процедуры в инфраструктуру сущностей 4.1?
Я использую Entity Framework 4.1 и иногда мне нужно вызвать хранимые процедуры. Некоторые из них возвращают int как возвращаемые значения. Например,
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity
( Обновить: удалено возвращаемое значение, не имеет значения. Мы возвращаем идентификатор)
У меня есть следующий код в моем классе репозитория:
var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single();
Это не удается с сообщением об ошибке The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.
Если я изменил код выше на
var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single();
все работает.
Теперь я думаю, что я должен вернуть int. Каков правильный способ сделать это?
Ответы
Ответ 1
Я предполагаю, что на основе редактирования вашего вопроса я щелкнул его вскоре после публикации, а затем немного обновился - что это только проблема, когда вы возвращаете личность?
Если это так, это десятичное число, потому что @@IDENTITY (и SCOPE_IDENTITY) возвращает числовое значение (38,0). См. Ответ на этот вопрос: Почему select SCOPE_IDENTITY() возвращает десятичное число вместо целого?
Как отмечено там, приведение к int должно позволить EF правильно определять тип.
Ответ 2
Не возвращайте @@Identity
или вы можете столкнуться с неожиданным поведением, так как @@Identity
возвращает последний id независимо от сеанса. Вместо этого используйте SCOPE_IDENTITY()
Я бы предположил, что возвращение SELECT cast(SCOPE_IDENTITY() as int)
Сделал бы для вас на стороне С#
Ответ 3
@@IDENTITY возвращает числовой тип с точностью 38 и шкалой 0, поэтому .NET правильно распознает ваш SP как возвращающий десятичный знак. Вы можете исправить это, добавив в свой SP:
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)