Как мне вернуть int из хранимой процедуры в Entity Framework 4.1? - PullRequest
11 голосов
/ 15 ноября 2011

Я использую Entity Framework 4.1 и иногда мне нужно вызывать хранимые процедуры.Некоторые из этих возвращаемых значений в качестве возвращаемых значений.Например,

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.Как правильно это сделать?

Ответы [ 3 ]

10 голосов
/ 15 ноября 2011

Полагаю, исходя из изменения вашего вопроса - я щелкнул по нему вскоре после публикации, а затем обновил его чуть позже - что это проблема, только когда вы возвращаете личность?

Если так, это десятичное число, потому что @@ IDENTITY (и SCOPE_IDENTITY) возвращают число (38,0).См. Ответ на этот вопрос: Почему метод SCOPE_IDENTITY () возвращает десятичное число вместо целого числа? Как уже отмечалось, приведение к int должно позволить EF правильно определять тип.

7 голосов
/ 15 ноября 2011

Не возвращайте @@Identity, иначе вы можете столкнуться с неожиданным поведением, поскольку @@Identity возвращает последний идентификатор независимо от сеанса.Используйте SCOPE_IDENTITY() вместо

Я думаю, что возвращение SELECT cast(SCOPE_IDENTITY() as int)

подойдет для вас на стороне C #

4 голосов
/ 15 ноября 2011

@@ IDENTITY возвращает числовой тип с точностью 38 и шкалой 0, поэтому .NET правильно распознает ваш SP как возвращающий десятичную дробь. Вы можете исправить это, добавив приведение в свой SP:

CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...