2017-05-28 87 views
3

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

+0

您可以使用ADO.NET爲您的DbContext –

+0

一個示例將不勝感激 – Tom

+0

可能重複的[如何在實體框架核心中運行存儲過程?](https://stackoverflow.com/questions/28599404/how-to -run-stored-procedures-in-entity-framework-core) –

回答

3

數據庫第一種方法是不存在的EF核心與EDMX files.Instead你必須使用腳手架的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

但是,要執行該存儲過程,使用FromSql方法,執行原始的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(); 

有一定的侷限性執行RAW SQL查詢或存儲procedures.You不能將其用於INSERT/UPDATE /使用刪除。如果你想執行INSERT,UPDATE,DELETE查詢,使用ExecuteSqlCommand

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

運行Scaffold-DbContext後出現以下錯誤System.ArgumentNullException:值不能爲空。 參數名稱:contentRootPath – Tom

1

我們EF核心用來執行存儲過程來得到的數據是通過使用FromSql方法解決方法,你可以執行存儲過程,這樣:

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

但對於創建,更新和刪除,我們使用ExecuteSqlCommand類似下面:執行存儲的P時

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

以上的例子做工精細如果您期望結果集與已定義的任何對象相同,則爲rocedure。但是如果你想要一個不被支持的結果集呢?據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(); 

我希望這幫助任何人。

+0

這樣做,每當我們使用EF生成模型,那麼我們需要每次手動添加dbset? –

+0

您可以將它們放在具有部分類的不同文件中,以使其更容易。 – Sami