Хранимые процедуры Scaffold-DbContext только в EF Core

Я всегда использовал code-first с EF Core, теперь мне нужно использовать Database-First. По этому поводу существует множество вопросов, документов и руководств, в которых рассказывается, как создать базу данных,

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

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

Я собирался создать шаблон, включая все, а затем удалить ненужные вручную, но это не кажется правильным выбором.


person Ashkan Mobayen Khiabani    schedule 14.12.2019    source источник
comment
Многие рабочие процессы, связанные с базой данных, не полностью автоматизированы.   -  person David Browne - Microsoft    schedule 14.12.2019
comment
@DavidBrowne-Microsoft, да, я понял, но есть ли способ включить хранимые процедуры и представления даже вручную?   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019
comment
Если вам просто нужны хранимые процедуры и представления, я бы сказал, создайте пустую миграцию и добавьте SP и представления вручную.   -  person Dennis1679    schedule 14.12.2019
comment
@ Dennis1679 у вас есть примеры?   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019
comment
Конечно, я отвечу с примером, если хотите.   -  person Dennis1679    schedule 14.12.2019
comment
@ Dennis1679 Dennis1679 большое спасибо, включите представление и хранимую процедуру   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019
comment
Логика будет одинакова для обоих. Я создам пример для вас.   -  person Dennis1679    schedule 14.12.2019
comment
может быть, это работает для вас? context.Database.ExecuteSqlCommand("YourStoredProcedure @p0, @p1", parameters: new[] { "Joseph", "Gates" });   -  person StepUp    schedule 14.12.2019
comment
@StepUp да, а как насчет просмотров? Scaffold-DbContext имеет переключатель -t для включения таблиц, но я пробовал, теперь он работает для представлений   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019
comment
попробую сделать так context.Database.ExecuteSqlCommand("Select Id, Name from myView");   -  person StepUp    schedule 14.12.2019
comment
Я бы попытался выполнить представления и SP без строительных лесов. На мой взгляд, это совершенно нормально.   -  person StepUp    schedule 14.12.2019
comment
@StepUp кажется, я пойду, как ты сказал. позвольте мне также попробовать ответ ErikEJ   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019
comment
@StepUp Я предлагаю вам добавить оба ваших комментария в качестве ответа, поскольку это единственный способ, который работает как для хранимой процедуры, так и для представлений.   -  person Ashkan Mobayen Khiabani    schedule 14.12.2019


Ответы (2)


Можно вызвать необработанный SQL, используя ExecuteSqlCommand. Таким образом, код для вызова хранимой процедуры будет выглядеть так:

context.Database.ExecuteSqlCommand("YourStoredProcedure @p0, @p1", 
    parameters: new[] { "Joseph", "Gates" });

ОБНОВЛЕНИЕ:

Как говорит msdn о том, как получить строки из сохраненных процедуры:

Необработанные SQL-запросы можно использовать для выполнения хранимой процедуры.

var user = "johndoe";

var blogs = context.Blogs
    .FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
    .ToList();

В следующем примере используется необработанный SQL-запрос, который выбирает функцию с табличным значением (TVF), а затем отключает отслеживание изменений с помощью вызова AsNoTracking:

var searchTerm = ".NET";

var blogs = context.Blogs
    .FromSqlInterpolated($"SELECT * FROM dbo.SearchBlogs({searchTerm})")
    .AsNoTracking()
    .ToList();
person StepUp    schedule 14.12.2019
comment
Это не возвращает никаких результатов - person ErikEJ; 15.12.2019

Используйте EF Core Power Tools, он позволяет выбрать, что нужно создать, и сохранит ваш выбор.

person ErikEJ    schedule 14.12.2019
comment
О, это действительно отличный инструмент, в нем отсутствуют только хранимые процедуры. - person Ashkan Mobayen Khiabani; 14.12.2019
comment
Как будет выглядеть реверс-инжиниринг хранимых процедур в коде? - person ErikEJ; 15.12.2019
comment
Предоставьте ссылку для запроса с перечисленными параметрами, это было бы здорово. - person Steve; 14.12.2020
comment
@ Стив, это уже реализовано - person ErikEJ; 15.12.2020