Подтвердить что ты не робот

Первая база EF 6: как обновить хранимые процедуры?

Мы используем Entity Framework 6.0.0 и сначала используем базу данных ( например) для генерации кода из таблиц и хранимых процедур. Это, похоже, отлично работает, за исключением того, что изменения в хранимых процедурах не отражаются при обновлении или обновлении модели. Отправка столбца в таблицу отражается, но не добавление поля в хранимую процедуру.

Интересно, что если я перейду к Model Browser, щелкните правой кнопкой мыши хранимую процедуру, выберите Add Function Import и нажмите кнопку Get Column Information, мы увидим правильные столбцы. Это означает, что модель знает о столбцах, но не обновляет сгенерированный код.

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

Я использую Visual Studio 2013 со всеми последними обновлениями по состоянию на начало декабря 2013 года.

Спасибо заранее!

Обновление 1: Ответ на запрос andersr помог в одном случае, когда хранимая процедура использовала временную таблицу, поэтому я дал ему +1, но она по-прежнему не решает основной проблемы обновления простых хранимых процедур.

Обновление 2: комментарий shimron ниже ссылок на вопрос о тех же проблемах в EF 3.5. Кажется, что все же верно для EF 6.0. Прочтите его для альтернативного способа сделать это, но мой вывод на данный момент заключается в том, что самый простой способ сделать это - удалить сгенерированную хранимую процедуру перед обновлением модели. Используйте частичные классы, если хотите сделать что-то фантастическое.

4b9b3361

Ответ 1

Основываясь на этом ответе DaveD, эти шаги касаются проблемы:

  • В .edmx, rt-click и выберите Обозреватель моделей.
  • В обозревателе моделей (в конфигурации по умолчанию VS 2015, это вкладка в обозревателе решений), разверните Импорт функций в рамках модели.
  • Дважды щелкните вашу хранимую процедуру.
  • Нажмите кнопку Обновить рядом с Возвращает коллекцию сложного (если не возвращает скаляр или объект)
  • Нажмите в порядке, затем сохраните ваш .edmx, чтобы отразить изменения полей в вашей хранимой процедуре во всем вашем проекте.

Ответ 2

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

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

Ответ 3

Я только что столкнулся с этим и моим обходным решением (это действительно противно) было создание оператора if с условием, которое никогда не будет истинным в верхней части хранимой процедуры, которая выбирает тот же список выходов, что и запрос с явным литьем к типам данных, которые я хочу вернуть. Это предполагает недействительность ваших типов, поэтому, чтобы разрешить, что вы завершаете листинг в ISNULL

Например, если ваш вывод имеет столбцы:

UserId (int, not null)
RoleId (int, nullable)
FirstName (varchar(255), nullable)
Created (datetime, not null)

Вы ожидаете, что это создаст POCO, например:

SomeClass {
    public int UserId { get; set; }
    public int? RoleId { get; set; }
    public string FirstName { get; set; }
    public DateTime Created { get; set; }
}

... Но это не так и почему мы здесь сегодня. Чтобы обойти это не так, как ожидалось, я поставил следующее в верхней части моего SP (сразу после "AS" ):

if(1=0)
begin
    select
        UserId = isnull((cast(0 as int)),0),
        RoleId = cast(0 as int),
        FirstName = cast(0 as varchar),
        DateTime = isnull((cast(0 as datetime)),'')
end

Это ужасно и уродливо, но он работает для меня каждый раз. Надеюсь, мы получим обновление инструментария, которое быстро разрешило это... случилось со мной сегодня без временных таблиц в SQL Server 2016 с VS2015...

Надеюсь, что это поможет кому-то.