我们正在使用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(代码优先)来使用参数调用此存储过程吗?
答案 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();
...
}