使用Entity框架核心生成和訪問存儲過程

asp.net-core entity-framework entity-framework-core

我正在使用Visual Studio 2017實現Asp.Net核心Web API,實體框架核心,數據庫第一種方法。我已經設法基於現有數據庫生成上下文和類文件。我需要使用我的上下文訪問存儲過程。在早期版本的實體框架中,通過在嚮導中選擇存儲過程對象並生成包含這些對象的edmx,可以很簡單。然後,我可以通過實體框架公開的複雜類型對象訪問存儲過程。我如何在實體框架核心中做類似的事情。一個例子會有幫助嗎?

一般承認的答案

數據庫第一種方法在EF Core中沒有edmx文件。相反,你必須使用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

但是,要執行存儲過程,請使用執行RAW 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();

執行RAW SQL查詢或存儲過程有一些限制。您不能將它用於INSERT / UPDATE / DELETE。如果要執行INSERT,UPDATE,DELETE查詢,請使用ExecuteSqlCommand

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

熱門答案

如果您希望結果集與已定義的任何對象相同,則上述示例在執行存儲過程時工作正常。但是如果你想要一個不受支持的結果集呢?根據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();

我希望這可以幫助任何人。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow