обновление хранимой процедуры в entity framework 3.5

<p>я использую .net 3.5 sp1, vs 2008 со структурой лица. первоначально я добавил хранимую процедуру в мою модель, которая приняла 2 параметра. позже я изменил sproc, чтобы принять только 1 параметр. я запустил опцию меню <code>update model from database</code> и подтвердил, что мой sproc был указан на вкладке <code>refresh</code>. закончил работу мастера, очистил и перестроил решение, и модель так и не изменила подпись спрока.</p><p>почему он не обновляется? не работает ли функция обновления модели из базы данных? я что-то пропустил? благодарю.</p>

<p>я видел две проблемы с обновлением хранимой процедуры после добавления ее в структуру сущности:</p><ul> <li>функция импорта, созданная для вызова sproc, не была обновлена (неверные, устаревшие параметры)</li> <li>сложный тип, созданный для результирующего набора sproc, не был обновлен (неправильные, устаревшие поля)</li> </ul><p><strong>обновление модели edmx (импорт функции)</strong></p><ol> <li>откройте файл .edmx (в конструкторе gui).</li> <li>щелкните правой кнопкой мыши в открытом пространстве и выберите "обновить модель из базы данных".</li> <li>нажмите готово (когда это возможно) во всплывающем окне. ваша подпись sproc должна быть обновлена (вместе с импортом всех функций).</li> </ol><p><strong>обновление сложного типа хранимой процедуры</strong></p><ol> <li> <p>откройте окно "<strong>model browser</strong>", пока у вас открыт .edmx.</p> </li> <li> <p>разверните узлы <strong>contentmodel</strong>, <strong>entitycontainer: ...</strong>, а затем <strong>импорт функций</strong>. найдите функцию импорта для вашей хранимой процедуры и <strong>двойной щелчок</strong> ее. откроется то же окно, которое вы использовали для его создания, но теперь оно заполнено данными.</p> </li> <li> <p>нажмите кнопку <strong>получить информацию о столбце</strong> (посмотрите на сетку под кнопкой, чтобы увидеть, что будет изменено).</p> </li> <li> <p>нажмите кнопку <strong>обновить</strong> рядом с переключателем "сложный".</p> </li> <li> <p>нажмите <strong>ok</strong>, и комплексный тип для вашего набора результатов должен быть обновлен.</p> </li> </ol>

<p>вам не нужно редактировать edmx/xml. сделай это:</p><p>когда вы вносите хранимую процедуру в edmx (я говорю о процедуре, которая возвращает набор результатов, но это будет аналогичный процесс), 3, а не 1, элементы создаются, и это является источником проблемы. (*** второй источник проблемы заключается в том, что вам необходимо явно сохранить после удаления объектов, прежде чем повторно импортировать объекты, в противном случае вновь повторно импортированные объекты будут конфликтовать с тем, что не было действительно удалено (путем сохранения) из edmx.</p><p>так! сделай это:</p><p>в обозревателе моделей, обычно слева, вставьте имя вашей хранимой процедуры в поле поиска, нажмите ввод (или поиск). он приземлится в первую очередь - возможно, сама хранимая процедура. щелкните правой кнопкой мыши и удалите. теперь поместите курсор обратно в поле поиска -> нажмите enter или выполните поиск снова. теперь вы попадете на функцию импорта. щелкните правой кнопкой мыши и удалите. сделайте то же самое в третий раз - это попадет на сложный тип, представляющий набор результатов. удали это. теперь вы сделали не !!!!! вы должны сохранить то, что вы только что сделали, чтобы удаления записывались (не записывались) в edmx.</p><p>теперь снова перейдите к хранимой процедуре (обновите модель/выберите сохраненный процесс). сейчас нажмите сохранить.</p><p>это будет работать каждый раз. ключ должен быть уверен при использовании браузера модели для поиска всех экземпляров имени хранимой процедуры, появляющихся в браузере модели, и поэтому лучше не суетиться с соглашениями об именах по умолчанию. второй ключ - это сохранить после выполнения любого шага.</p>

<p>если вам нужно изменить типы данных столбцов в наборе результатов -> в начале процесса stor, добавьте <strong>отключите fmtonly</strong></p><p>затем используйте браузер моделей -> импорт функций -> редактировать процесс -> кнопка "получить информацию о столбцах" -> кнопка "обновить"</p><p>вот как это делает нил :)</p>

<p>если вы измените подпись хранимого процесса, вам потребуется обновить любой сложный тип, созданный в модели, с помощью функции импорта.</p>

<p>потребовалось много ручного редактирования xml и несколько перезапусков visual studio, но я наконец смог заставить vs забыть предыдущую подпись. затем я просто использовал обычный мастер ef, чтобы добавить его обратно, и он работал отлично.</p>

<p>вы также можете стереть все свидетельства sp в следующих местах, эти файлы можно найти в обозревателе моделей при открытии файла .edmx:</p><ul> <li>yourmodel> сложные типы;</li> <li>yourmodel> импорт функций;</li> <li>yourmodel.store> хранимые процедуры/функции.</li> </ul><p>после удаления вы можете добавить его обратно без проблем.</p>

<p>подобная проблема возникла в ef4, где нет возможности обновить отдельные sps, она предназначена для этого, когда вы нажимаете кнопку обновить в мастере обновления, но она не работает надежно. мне пришлось в браузере модели удалить сложные типы возвращаемых значений, а также функцию импорта. затем перейдите в файл edmx с помощью редактора xml и удалите ссылку на сохраненный процесс (не удалось найти способ сделать это в браузере модели). затем заново добавьте sps.</p>

<p>вы должны удалить и добавить хранимые процедуры обратно, поскольку структура сущностей должна сгенерировать новое определение для вашей процедуры. я думаю, вам нужно повторить функцию импорта.</p><p>в основном, если вы изменили логику процедуры, а не тип возвращаемого значения или сигнатуру, вам не нужно добавлять его снова. это будет работать нормально, но если вы измените тип возвращаемого значения или сигнатуру, ef необходимо будет сгенерировать и сопоставить его с новым определением, которое так и будет работать.</p>