TVF (функция табличного значения) в структуре сущностей с использованием кода сначала

Кто-нибудь знает, можно ли использовать TVF в структуре сущностей с использованием кода? Чтобы быть конкретным:

Я знаю, что в настоящее время это не поддерживается для кода сначала (и не похоже, что EF6 это позволит). С другой стороны, более поздние версии EF поддерживают TVF в сценарии с базой данных (что мне не подходит). Мне интересно, знает ли кто-нибудь, есть ли способ подражать тому, что сначала делает база данных, манипулируя моделью или чем-то подобным?

Еще одно уточнение; Я знаю, что можно включать TVF с помощью SQL, но мне также нужно, чтобы TVF можно было компоновать (т. е. быть частью оператора LINQ).


person Kjetil Samuelsen    schedule 03.06.2013    source источник
comment
В EF6 очень хитрым обходным путем является использование перехватчика для перезаписи имени таблицы сущности в вызов TVF. Я сделал пример реализации здесь. Не рекомендуется!   -  person sinelaw    schedule 19.02.2014
comment
Теперь это возможно с EF6.1 и пользовательским соглашением, которое я создал. Взгляните на мой ответ ниже.   -  person Pawel    schedule 10.04.2014


Ответы (3)


Теперь это возможно. Я создал пользовательское соглашение о модели, которое позволяет использовать функции хранения в CodeFirst в EF6.1. Соглашение доступно в NuGet http://www.nuget.org/packages/EntityFramework.CodeFirstStoreFunctions. Вот ссылка на сообщение в блоге, содержащее все подробности: http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

person Pawel    schedule 10.04.2014
comment
Потрясающая работа Павел! Я читал ваш блог ранее сегодня. Я с нетерпением жду возможности попробовать это в следующий раз, когда мы попытаемся избавиться от файлов edmx. - person Cameron Taggart; 11.04.2014

В настоящее время это не невозможно. Это было отложено до окончания EF6. Лучше всего проголосовать за него на их доске User Voice. Предлагаемая функция называется "Поддержка Code First для функций с табличным значением". Я только что поставил 3 голоса за него.

person Cameron Taggart    schedule 30.11.2013
comment
Теперь это возможно - см. мой ответ. - person Pawel; 11.04.2014

Вы можете использовать Table-Valued Function в Entity Framework 5. Я думаю, что ссылка решит ваш вопрос:

Для использования функции табличного значения в Entity Framework вам необходимо выполнить следующие шаги:

1. Щелкните правой кнопкой мыши имя проекта в обозревателе решений, выберите пункт Добавить, а затем щелкните Новый
элемент.

2. Выберите «Данные» в меню слева, а затем выберите «Модель данных сущности ADO.NET» на панели «Шаблоны».

3. Введите TVFModel.edmx в качестве имени файла и нажмите "Добавить".

4. В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите "Далее".

5. Нажмите «Новое подключение». Введите (localdb)\v11.0 в текстовое поле «Имя сервера». Введите School для имени базы данных. Нажмите «ОК».

6. В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы" выберите таблицы
Person, StudentGrade и Course.

7. Выберите функцию GetStudentGradesForCourse, расположенную в узле "Хранимые процедуры и функции". Обратите внимание, что, начиная с Visual Studio 2012, Entity Designer
позволяет выполнять пакетный импорт хранимых процедур и функций.

8. Нажмите "Готово".

9. Отображается Entity Designer, предоставляющий рабочую область для редактирования вашей модели
. Все объекты, выбранные вами в диалоговом окне Choose Your Database Objects
, добавляются в модель.

10. По умолчанию результирующая форма каждой импортированной хранимой процедуры или функции
автоматически становится новым сложным типом в вашей модели объекта. Но мы хотим сопоставить результаты функции GetStudentGradesForCourse с сущностью StudentGrade: щелкните правой кнопкой мыши область конструктора и выберите "Обозреватель моделей". В обозревателе моделей выберите "Импорт функций", а затем дважды щелкните функцию
GetStudentGradesForCourse. диалоговое окно, выберите Entities и выберите StudentGrade

Вы можете использовать следующий код, чтобы использовать Table-Value Function в приложении для получения данных:

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title, 
            result.Person.FirstName, 
            result.Person.LastName);
    }
}
person Vaibhav Parmar    schedule 14.11.2013
comment
Вайбхав, он спрашивает о поддержке кода. Файл .edmx — это база данных в первую очередь. - person Cameron Taggart; 30.11.2013