簡體   English   中英

在 Asp.Net MVC 5 中使用實體框架 6 代碼優先方法調用存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM