Создание хранимых процедур и доступ к ним с использованием ядра Entity framework

я реализую Asp.Net core Web API, ядро entity framework, первый подход к базе данных с использованием Visual Studio 2017. Мне удалось создать файлы контекста и классов на основе существующей базы данных. Мне нужно получить доступ к хранимым процедурам, используя мой контекст. В более ранней версии entity framework было просто выбрать объекты хранимых процедур в Мастере и создать edmx, содержащий эти объекты. Затем я мог получить доступ к хранимым процедурам через объекты сложного типа предоставляется Entity framework. Как сделать аналогичную вещь в Entity framework core. Пример поможет ?

3 ответов


первый подход к базе данных отсутствует в ядре EF с файлами edmx.Вместо этого вам нужно использовать Scaffold-DbContext

установите пакеты Nuget Microsoft.EntityFrameworkCore.Инструменты и Microsoft.EntityFrameworkCore.От SQLServer.Дизайн

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

но это не получит ваши хранимые процедуры. Он все еще в работе, проблема отслеживания #245

но для выполнения хранимых процедур используйте FromSql метод, который выполняет RAW SQL-запросы

например

var products= context.Products
    .FromSql("EXECUTE dbo.GetProducts")
    .ToList();

использовать параметры

var productCategory= "Electronics";

var product = context.Products
    .FromSql("EXECUTE dbo.GetProductByCategory {0}", productCategory)
    .ToList();

или

var productCategory= new SqlParameter("productCategory", "Electronics");

var product = context.Product
    .FromSql("EXECUTE dbo.GetProductByName  @productCategory", productCategory)
    .ToList();

существуют определенные ограничения для выполнения необработанных SQL-запросов или хранимых процедур.Вы не можете использовать его для вставки/обновления/удаления. если вы хотите выполнить запросы INSERT, UPDATE, DELETE, используйте ExecuteSqlCommand

var categoryName = "Electronics";
dataContext.Database
           .ExecuteSqlCommand("dbo.InsertCategory @p0", categoryName);

приведенные выше примеры отлично работают при выполнении хранимой процедуры, если вы ожидаете, что результирующий набор будет таким же, как и любой уже определенный объект. Но что делать, если вы хотите resultset, который не поддерживается? По словам разработчиков EF Core 2, это функция, которая придет, но уже сегодня есть простое решение.

создайте модель, которую вы хотите использовать для вывода. Эта модель будет представлять выходные данные, а не таблицу в базе данных.

namespace Example.EF.Model
{
    public class Sample
    {
        public int SampleID { get; set; }
        public string SampleName { get; set; }
    }
}

затем добавьте в свой контекст новый DBSet с вашей моделью:

public virtual DbSet<Sample> Sample { get; set; }

а затем сделайте, как указано выше, и используйте свою модель для вывода:

var products = _samplecontext.Sample
      .FromSql($"EXEC ReturnAllSamples {id}, {startdate}, {enddate}").ToList();

Я надеюсь, что это поможет кому-нибудь.


обходной путь, который мы используем в EF Core для выполнения хранимых процедур для получения данных, с помощью метода FromSql, и вы можете выполнить хранимую процедуру следующим образом:

List<Employee> employees = dbcontext.Employee
                    .FromSql("GetAllEmployees").ToList();

но для создания, обновления и удаления, мы используем ExecuteSqlCommand, как показано ниже:

var employee = "Harold Javier";
dbcontext.Employee
           .ExecuteSqlCommand("InsertEmployee @emp", employee);