在Asp.Net MVC 5中使用Entity Framework 6代码第一种方法调用存储过程

时间:2016-12-27 08:47:41

标签: c# asp.net-mvc stored-procedures ef-code-first entity-framework-6

我们正在使用Ado.Net从ASP.NET MVC中的C#代码处理数据库。我想使用Entity Framework,所以我需要使用存储过程,从EF调用存储过程。

有几个例子如何使用Entity Framework存储过程,但没有一个特定于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

有人可以告诉我如何使用Entity Framework(代码优先)来使用参数调用此存储过程吗?

3 个答案:

答案 0 :(得分:3)

您可以按照以下方式在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();

答案 1 :(得分:1)

您应该使用CodeFirstStoredProcs库。它最适合Code第一种方法,它支持存储过程的所有功能。我正在将它用于许多项目。

此外,您还可以使用Code第一个用户函数库来调用用户定义的函数。我为它创建了库。 CodeFirstFunctions

答案 2 :(得分:1)

第 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; }
}

步骤 4

为您的存储过程创建迁移

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();
    ...
}