![](/img/trans.png)
[英]Foreign key relationship missing in ASP.NET MVC app using code-first approach with Entity Framework
[英]Call stored procedures with Entity Framework 6 code first approach in Asp.Net MVC 5
我們正在使用 Ado.Net 來處理來自 ASP.NET MVC 中的 C# 代碼的數據庫。 我想使用實體框架,所以我需要使用它的存儲過程,從 EF 調用存儲過程。
有幾個示例如何在實體框架中使用存儲過程,但沒有一個特定於 ASP.NET MVC 和代碼優先(至少我找不到任何示例)。
它們是一個好的開始,但我需要更多、更好的信息和更好的例子!
我有這個存儲過程:
Create Procedure spAddEmployee
@Name nvarchar(50),
@Gender nvarchar(20),
@Salary int,
@EmployeeId int Out
as
Begin
Insert into tblEmployees
values(@Name, @Gender, @Salary)
Select @EmployeeId = SCOPE_IDENTITY()
End
所以@Name
, @Salary
, @Gender
是輸入參數,和@EmployeeId
是一個輸出參數,它返回ID
新加入的雇員的。
有人能告訴我如何使用實體框架(代碼優先)來調用這個帶有參數的存儲過程嗎?
您可以在DbContext
類中調用存儲過程,如下所示。
this.Database.SqlQuery<YourEntityType>("storedProcedureName",params);
更新:
這是如何在 ActionResult 中調用 SP 的示例:
public ActionResult ExecuteProcedure()
{
using(var db = new CueEntities())
{
var parameter = 1;
var query = db.Database.SqlQuery<TestProcedure>("TestProcedure @parameter1",
new SqlParameter("@parameter1", parameter)).ToList();
return Json(query,JsonRequestBehavior.AllowGet);
}
}
第二次更新:
對於多個參數,您可以輕松地這樣做:
var param1 = new SqlParameter();
param1.ParameterName = "@Value1";
param1.SqlDbType = SqlDbType.Int;
param1.SqlValue = val1;
var param2 = new SqlParameter();
param2.ParameterName = "@Value2";
param2.SqlDbType = SqlDbType.NVarChar;
param2.SqlValue = val2;
var result = db.tablename.SqlQuery("SP_Name @Value1,@Value2", param1, param2 ).ToList();
您應該使用CodeFirstStoredProcs庫。 它最適合代碼優先方法,它支持存儲過程的所有功能。 我在許多項目中使用它。
您也可以使用 Code first 用戶函數庫來調用用戶定義的函數。 我已經為它創建了庫。 代碼優先函數
第1步:
創建您的存儲過程腳本。
IF OBJECT_ID ( 'usp_GetUserByCompany', 'P' ) IS NOT NULL
DROP PROCEDURE usp_GetUserByCompany;
GO
CREATE PROCEDURE usp_GetUserByCompany
@__ProfileId [uniqueidentifier],
@__CompanyId [uniqueidentifier],
@__Email VARCHAR (MAX),
AS
SELECT *
FROM [UserProfiles] AS [u]
WHERE [u].[ProfileId] = @__ProfileId
AND [u].[CompanyId] = @__CompanyId
AND [u].[Email] = @__Email
GO
第2步
為您的班級創建模型
public class UserProfile {
public Guid Id { get;set; }
public Guid CompanyId { get; set; }
public Company Company { get;set; }
public string Email { get;set; }
...
}
第 3 步
轉到您的 ApplicationDbContext 類
public class ApplicationDbContext {
...
public virtual DbQuery<UserProfile> UserProfiles { get; set; }
}
第四步
為您的存儲過程創建遷移
dotnet ef migrations add Add_SP_GetUserProfileByCompany
第 5 步
在生成的遷移類中實現步驟 1 中的存儲過程腳本
public partial class Add_SP_GetUserProfileByCompany : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
var usp_GetUserByCompany = @"
IF OBJECT_ID ( 'usp_GetUserByCompany', 'P' ) IS NOT NULL
DROP PROCEDURE usp_GetUserByCompany;
GO
CREATE PROCEDURE usp_GetUserByCompany
@__ProfileId [uniqueidentifier],
@__CompanyId [uniqueidentifier],
@__Email VARCHAR (MAX),
AS
SELECT *
FROM [UserProfiles] AS [u]
WHERE [u].[ProfileId] = @__ProfileId
AND [u].[CompanyId] = @__CompanyId
AND [u].[Email] = @__Email
GO
";
migrationBuilder.Sql(usp_GetUserByCompany);
}
...
}
第 6 步
在系統或服務等的某個地方的代碼中,
public List<UserProfile> GetUserProfileByCompanySP(Guid ProfileId, Guid CompanyId, string Email)
{
var dbContext = new ApplicationDbContext;
var parameters = new object[]
{
new SqlParameter() {ParameterName = "@__ProfileId", Direction = ParameterDirection.Input, SqlDbType = SqlDbType.UniqueIdentifier, Value = ProfileId},
new SqlParameter() {ParameterName = "@__CompanyId", Direction = ParameterDirection.Input, SqlDbType = SqlDbType.UniqueIdentifier, Value = CompanyId},
new SqlParameter() {ParameterName = "@__Email", Direction = ParameterDirection.Input, SqlDbType = SqlDbType.VarChar, Size = 64, Value = Email},
};
var output = dbContext.UserProfiles.FromSql("usp_GetUserByCompany @__ProfileId, @__CompanyId, @__Email", parameters).ToList();
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.