Как мне вернуть 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)