我正在實現使用Visual Studio 2017的Asp.Net核心Web API,實體框架核心,數據庫第一種方法。我設法根據現有數據庫生成上下文和類文件。我需要使用我的上下文訪問存儲過程。在較早版本的實體框架中,選擇嚮導中的存儲過程對象並生成包含這些對象的edmx非常簡單。然後我可以通過實體框架公開的複雜類型對象訪問存儲過程。我如何在實體框架核心中做類似的事情。一個例子會有幫助嗎?使用實體框架核心生成和訪問存儲過程
回答
數據庫第一種方法是不存在的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);
運行Scaffold-DbContext後出現以下錯誤System.ArgumentNullException:值不能爲空。 參數名稱:contentRootPath – Tom
我們EF核心用來執行存儲過程來得到的數據是通過使用FromSql方法解決方法,你可以執行存儲過程,這樣:
List<Employee> employees = dbcontext.Employee
.FromSql("GetAllEmployees").ToList();
但對於創建,更新和刪除,我們使用ExecuteSqlCommand類似下面:執行存儲的P時
var employee = "Harold Javier";
dbcontext.Employee
.ExecuteSqlCommand("InsertEmployee @emp", employee);
以上的例子做工精細如果您期望結果集與已定義的任何對象相同,則爲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();
我希望這幫助任何人。
這樣做,每當我們使用EF生成模型,那麼我們需要每次手動添加dbset? –
您可以將它們放在具有部分類的不同文件中,以使其更容易。 – Sami
- 1. 實體框架核心,存儲過程
- 2. 從實體框架核心調用現有存儲過程
- 3. 實體框架的核心存儲過程無需DbSet
- 4. .NET核心實體框架存儲過程
- 5. 實體框架4.0和存儲過程
- 6. 實體框架和MySql存儲過程
- 7. 實體框架存儲過程和POCO
- 8. C#實體框架核心和存儲庫
- 9. 實體框架核心:InvalidOperationException
- 10. 實體框架核心過濾器DbSet
- 11. 實體框架核心.Include()問題
- 12. 使用存儲過程混合實體框架 - 連接問題
- 13. Exec的實體框架中的核心存儲過程的輸出參數2
- 14. 實體框架核心1.1和遷移
- 15. MongoDB和實體框架核心2.0
- 16. 使用存儲過程和實體框架的MVC 3 4
- 17. 使用存儲過程和未命名列的實體框架
- 18. 實體框架MySQL的存儲過程
- 19. 存儲過程與實體框架
- 20. SQL存儲過程實體框架VB.Net
- 21. 實體框架多個存儲過程
- 22. 從實體框架的存儲過程
- 23. 存儲過程與ADO.NET實體框架
- 24. 存儲過程映射實體框架
- 25. 存儲過程MVC3實體框架 - VARBINARY
- 26. 實體框架 - 存儲過程
- 27. 使用實體框架4.1與DDD訪問存儲過程的代碼生成DbContext
- 28. 如何調用存儲過程極好返回數據使用實體框架和。核心1.1
- 29. 實體框架構建存儲庫時的核心工具
- 30. 實體框架核心通用查詢
您可以使用ADO.NET爲您的DbContext –
一個示例將不勝感激 – Tom
可能重複的[如何在實體框架核心中運行存儲過程?](https://stackoverflow.com/questions/28599404/how-to -run-stored-procedures-in-entity-framework-core) –