如何使用EntityFramework 7和Asp.Net 5調用SQL存儲過程


在過去的幾天裡,我正在尋找一些關於如何使用EntityFramework 7Web API控制器方法中調用Stored Procedure教程。

我通過的所有教程都反過來展示了它,即Code First方法。但我已經有了一個數據庫,我需要用它來構建一個Web API 。各種業務邏輯已經編寫為存儲過程和視圖,我必須使用來自Web API的那些邏輯。

問題1:這是否可以繼續使用EF7 Database First方法並使用上面的數據庫對象?

我通過以下NuGet命令將EntityFramework 6.1.3安裝到我的包中:

install-package EntityFramework ,它將版本6.1.3添加到我的項目中,但立即開始顯示錯誤消息(請參閱下面的屏幕截圖)。我不清楚如何解決這個問題。

在此處輸入圖像描述

我有另一個測試項目,在project.json我可以看到兩個如下的條目:

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",

但是,當我在Nu-Get包管理器中搜索時,我看不到這個版本!只有6.1.3即將到來。

我的主要目標是從現有數據庫中使用已編寫的存儲過程和視圖。

1)我不想使用ADO.Net ,而是想使用EntityFramework來使用ORM

2)如果EntityFramework 6.1.3能夠從現有數據庫調用Stored ProcsViews ,我如何解決錯誤(截圖)?

實現這一目標的最佳做法是什麼?

一般承認的答案

我希望我正確理解你的問題。您在數據庫中有現有的STORED PROCEDURE,例如dbo.spGetSomeData ,它返回包含某些字段的某些項的列表,您需要從Web API方法提供數據。

實施可以是以下幾點。您可以定義一個空的 DbContext如:

public class MyDbContext : DbContext
{
}

並使用數據庫的連接字符串定義appsettings.json

public class MyDbContext : DbContext
{
}

您應該使用Microsoft.Extensions.DependencyInjectionMyDbContext添加到

public class MyDbContext : DbContext
{
}

現在,您可以按以下方式實施WebApi操作:

public class MyDbContext : DbContext
{
}

上面的代碼只使用exec dbo.spGetSomeData執行,並使用dataRader讀取所有結果並保存在dynamic像中。如果您要從api/My進行$.ajax調用,您將獲得從dbo.spGetSomeData返回的數據,您可以直接在JavaScript代碼中使用它。上面的代碼非常透明。 dbo.spGetSomeData返回的數據集中的字段名稱將是JavaScript代碼中屬性的名稱。 您無需以任何方式管理C#代碼中的任何實體類。您的C#代碼沒有從存儲過程返回的字段名稱。因此,如果您要擴展/更改dbo.spGetSomeData的代碼(重命名某些字段,添加新字段),則只需調整JavaScript代碼,但不需要調整C#代碼。


熱門答案

DbContext有一個Database屬性,它保存與數據庫的連接,您可以隨意執行以下操作:

context.Database.SqlQuery<Foo>("exec [dbo].[GetFoo] @Bar = {0}", bar);

但是,我建議您不要在Web Api操作中執行此操作,而是向上下文或與上下文交互的任何服務/存儲庫添加方法。然後在您的操作中調用此方法。理想情況下,您希望將所有SQL內容保存在一個位置。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因