0

Я перенесла мой проект из Linq-to-SQL в Entity Framework 6. После решения многих проблем я, наконец, пришел к одному Я не уверен, что делать с Это. После преобразования примерно одна треть моих модульных тестов терпит неудачу, потому что хранимые процедуры возвращают скалярные значения just work different way.Перенос хранимой процедуры из LINQ в SQL в Entity Framework 6

В Linq-to-SQL хранимая процедура возвращает возвращаемое значение. В EF они возвращают количество затронутых строк. Существуют обходные пути, которые требуют изменения хранимой процедуры (обычно от RETURN @retvalue до SELECT @retvalue). Но это требует изменений в T-SQL. Проект по-прежнему содержит некоторый старый код из старых дней ASP.NET, например aspnet_Membership_CreateUser и так далее. Это означает, что я не могу изменить эти хранимые процедуры, потому что они частично используются поставщиком членства ASP.NET ADO.NET, частично кодом Linq-to-SQL. Решение, которое я рассматриваю, заключается в том, чтобы сделать обертку T-SQL из этих частей устаревшим кодом.

Еще одна причина, по которой я хотел бы сохранить хранимую процедуру без изменений, - это возможность возврата к предыдущей фиксации, если обновление до EF не выполняется. A не хотите менять базу данных вперед и назад. Но эта причина не так сильна, это касается только моей лени.

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

Лучший способ завершить миграцию - вызвать хранимую процедуру из EF, например Linq-to-SQL, но я не нашел способ ее использования. EF разочаровал меня в этом. Как возможно, что после лет разработки EF не поддерживает возврат скалярного значения из хранимой процедуры?

Как вы решили эту проблему?

ответ

0

Finnaly Я в конечном итоге с обертками, которые сохраняют первоначальную функциональность базы данных (для ASP.NET MembershipProvider) и создать версию хранимых процедур для EntityFramework:

CREATE PROCEDURE [dbo].[aspnet_UsersInRoles_AddUsersToRolesEF] 
    @ApplicationName nvarchar(256), 
    @UserNames  nvarchar(4000), 
    @RoleNames  nvarchar(4000), 
    @CurrentTimeUtc datetime 
AS 
BEGIN 
    DECLARE @return_value int 

EXEC @return_value = [dbo].[aspnet_UsersInRoles_AddUsersToRoles] 
     @ApplicationName, 
     @UserNames, 
     @RoleNames, 
     @CurrentTimeUtc 

SELECT @return_value 
END 

GO 

Теперь я могу использовать компилятор, чтобы проверить номер и типы параметров в процедуре хранения.

0

Привет Qub1n,

// Create the gender parameter var param1 = new SqlParameter { 
    ParameterName = "@userId", 
    Value = _userId }; 

    // Create the return code var returnValue = new SqlParameter { 
    ParameterName = "@ReturnCode", 
    SqlDbType = System.Data.SqlDbType.Int, 
    Direction = System.Data.ParameterDirection.Output }; 


    // Gender is an int column in the database. 
    _context 
    .Database 
    .ExecuteSqlCommand("exec @ReturnCode = GetGenderOfUser  @userId", 
    param1, returnValue); 

    return (int)returnValue.Value; 

Это работает для меня. Мой хранимый процесс выглядит следующим образом:

CREATE PROCEDURE [dbo].[GetGenderOfUser] 
    -- Add the parameters for the stored procedure here 
    @userId uniqueidentifier 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    declare @retval int 
    -- Insert statements for procedure here 
    set @retval = (select top(1) Gender from Users where Guid = @userId) 

    return @retval 
END 

Дайте мне знать, если это сработает!

+0

Наконец-то я закончил решение, размещенное выше. ExecuteSqlCommand будет работать, но я не могу автоматически генерировать/обновлять модель из базы данных. – qub1n

 Смежные вопросы

  • Нет связанных вопросов^_^