Отображение выбранных хранимых процедур в рамках сущности - PullRequest
5 голосов
/ 31 октября 2011

Мой сценарий Я использую Visual Studio 2010 с Entity Framework 4.1. У меня есть устаревшая база данных со множеством таблиц и множеством хранимых процедур.Я пишу программу на ASP.NET C # с использованием MVC 3

. Я принял «сначала базу данных», используя ADO.NET DbContext, поэтому у меня есть edmx со всеми моделями, ассоциациями и навигационными свойствами,Я могу сопоставить процедуры вставки, обновления, удаления с соответствующими моделями.Я использовал «Импорт функций» для импорта других хранимых процедур.Однако я не могу найти способ сопоставить свои процедуры выбора для выбора действий (выбрать по идентификатору, выбрать список, выбрать по фильтру и т. Д.).

Кажется, EF использует отложенную загрузку, поэтому я хочу, чтобы это произошлокогда объект выбирает свои дочерние объекты, он использует хранимые процедуры, уже написанные.(Процедуры выбора принимают во внимание флаг IsDeleted и используют, среди прочего, предложение «ORDER BY»)

Из этой статьи http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx я вижу, что Linq to SQL позволяет перетаскиватьSP, который звучит, более или менее, именно то, что я хочу.

Я также сталкивался с термином DefiningQuery.http://msdn.microsoft.com/en-us/library/cc982038.aspx Это то, что я хочу?Мне не нравится примечание «Любые изменения, внесенные в модель хранилища, включая определение запросов, будут перезаписаны при запуске мастера обновления модели».

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

Могу ли я достичь своей цели с помощью Entity Framework?Я пропустил что-то очевидное?

Или я должен попытаться быть по-настоящему умным и изменить шаблон db Entity T4, чтобы, например, моя сгенерированная модель адресов имела это свойство:

public virtual ICollection<AddressLine> AddressLines { 
    get{
        DBWrapper _db = new DBWrapper();
        return _db.GetAddressLines(AddressID);
    } 
    set{}; 
}

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

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

Это невозможно.Вы можете импортировать ваши хранимые процедуры как функции импорта и выполнять их вручную, но вы не можете заменить запросы, сгенерированные EF, на пользовательские хранимые процедуры.

2 голосов
/ 05 мая 2013

Кроме того, что вы можете, вроде.

Возьмите вашу основную хранимую процедуру выбора (т. Е. Ту, которая наиболее близка к «select * from mytable»), и используйте ее для определения представления в вашей базе данных. Пусть структура сущностей использует этот «myview» вместо «mytable» Затем сопоставьте вставку, обновите и удалите сохраненные процедуры для этой сущности на основе представления, как вы изначально делали для своей таблицы.

Наконец, используйте функции импорта для более избирательных выборок и определите их для возврата коллекций вашей сущности. Поэтому, если у вас есть что-то вроде сущности Person, и у вас есть хранимый процесс, называемый чем-то вроде FetchPersonByAge (int), ваша сущность в итоге получит статический метод, называемый чем-то вроде «GetByAge (int)». Затем вы можете вызвать его в таком коде: var people33 = Person.getByAge (33);

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

http://msdn.microsoft.com/en-us/data/gg699321.aspx

Dave

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