Отражение изменений, внесенных в хранимую процедуру в сгенерированном Entity Framework сложном типе - PullRequest
9 голосов
/ 14 июля 2011

Итак, у меня есть база данных в SQL Server, к которой я подключаюсь и использую Entity Framework 4.1 для генерации моих классов POCO, что в целом работает довольно хорошо.Существуют также хранимые процедуры, в которых я использую функцию «импорт функции» для создания получения полученных строк данных при их вызове.По сути, я использую следующий процесс:

  1. Щелкните правой кнопкой мыши Model.edmx и выберите «Импорт функции ...»
  2. Выберите процедуру из выпадающего списка
  3. Введите желаемое имя для импорта функции
  4. Нажмите «Получить информацию о столбце»
  5. Нажмите «Создать новый комплексный тип»
  6. Нажмите «ОК»

, и это создаст класс POCO для определения набора результатов, и я могу сделать что-то вроде:

var query = context.GetMyStuff().AsQueryable();

для получения результатов.Кажется, это работает просто отлично.

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

Что за тренировка должна отражать это обновление процедуры на стороне C #?Я собираюсь каждый раз делать новый урок?Мне было неочевидно, как это сделать.


Дополнительная информация:

Когда я пытался «обновить» тип Complex, как было предложено в ответе Ладислава на этот вопрос , я получаю сообщение об ошибке «Убедитесь, что имя FunctionImport уникально».

Если я попробую то, что предлагает Э.Дж. Бреннан ниже, я получу то же сообщение об ошибке.

То, что делает , работает, по крайней мере, для меня, - это открыть файл Model.edmx в Notepad ++, найти строку FunctionImport и удалить ее, а затем восстановить ее.Это не идеально, но это сработало.

Ответы [ 5 ]

26 голосов
/ 01 октября 2015

(Это решение для EF 6. Я не пробовал в других версиях EF. Это хорошо работает.) Я поддерживаю ответ Бреннана, иллюстрируя пример, чтобы сделать его более понятным для наивных кодеров, таких как я:)


Перейти к модели браузера.MyStoreProc - это имя хранимой процедуры (в качестве примера).MyStoreProc будет отображаться в 3 местах.

  1. 1-е место - под комплексными типами -> как MyStoreProc_result
  2. 2-е место - под импортом функций -> как MyStoreProc
  3. 3-е место- В разделе «Сохраненные процедуры / функции» -> как MyStoreProc enter image description here

Удалить все три из модели.Сохраните EDMX (нажав в окне, затем Ctrl + S).Затем щелкните правой кнопкой мыши и выберите обновить модель из базы данных.Затем добавьте обновленную хранимую процедуру и снова сохраните.

Решено без проблем:)

9 голосов
/ 14 июля 2011

Обычно я захожу в браузер модели. В главном меню выберите «Вид»> «Другие окна»> «Браузер модели данных объекта» (он обычно открывается на той же панели, что и «Обозреватель решений»), и удалите измененную хранимую процедуру и повторно добавьте ее. это обратно.

Там может быть проще, но этот работает для меня.

Редактировать: "Обновление модели из базы данных" теоретически также должно работать, но, по моему опыту, это не работает 100% времени, удаление и повторное добавление кажется надежным.

2 голосов
/ 22 октября 2015

В нашей компании мы обновляли SP как ответ SArifin ... который работает, но это своего рода перетаскивание.

Недавно мы обнаружили, что вам нужно только перейти к этой функции импорта SP ->Щелкните правой кнопкой мыши -> Изменить -> Обновить сложный тип.

1 голос
/ 05 сентября 2013

Я только что столкнулся с той же проблемой, и спасибо за ваш ответ!Еще одна вещь, которую я должен был сделать, это удалить выходные данные из «Сложных типов» в браузере модели.

1 голос
/ 05 июня 2013

@ itsmatt - ваше решение сработало для меня.Короче говоря,

  1. Откройте файл .edmx в текстовом редакторе.
  2. Найдите и удалите узел XML, который выглядит следующим образом:
<FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)">
(additional lines. . .)
</FunctionImport>
  1. Сохранить файл
  2. В браузере модели обновите модель из базы данных, повторно добавив сохраненный процесс
  3. Выберите недавно добавленный сохраненный процесс, затем выберитепункт «Импорт функции» из контекстного меню и т. д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...