我正在使用Visual Studio 2017实现ASP.NET核心Web API,实体框架核心,数据库优先方法。我已经设法基于一个现有的数据库生成上下文和类文件。我需要使用上下文访问存储过程。在entity framework的早期版本中,只需在向导中选择存储过程对象并生成包含这些对象的edmx就可以了。然后,我可以通过实体框架公开的复杂类型对象访问存储过程。我如何在实体框架核心中做类似的事情。举个例子会有帮助吗?
使用edmx文件的EF核心中没有数据库优先的方法,而是必须使用Scaffold-DbContext
安装Nuget包Microsoft.EntityFrameworkCore.Tools和Microsoft.EntityFrameworkCore.SQLServer.Design
Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
但这不会得到存储过程。它仍然在工作跟踪问题245
但是,要执行存储过程,请使用执行原始SQL查询的FromSql方法
例如。
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。如果要执行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();
但是对于Create,Update和Delete,我们使用如下所示的ExecuteSqlCommand:
var employee = "Harold Javier";
dbcontext.Employee
.ExecuteSqlCommand("InsertEmployee @emp", employee);