当前位置: 首页 > 知识库问答 >
问题:

如何在实体框架6中调用存储过程(代码优先)?

葛季萌
2023-03-14

我对Entity Framework 6非常陌生,我想在我的项目中实现存储过程。我有一个存储过程,如下所示:

ALTER PROCEDURE [dbo].[insert_department]
    @Name [varchar](100)
AS
BEGIN
    INSERT [dbo].[Departments]([Name])
    VALUES (@Name)

    DECLARE @DeptId int

    SELECT @DeptId = [DeptId]
    FROM [dbo].[Departments]
    WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()

    SELECT t0.[DeptId]
    FROM [dbo].[Departments] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END

部门班级:

public class Department
{
    public int DepartmentId { get; set; }       
    public string Name { get; set; }
}

modelBuilder 
.Entity<Department>() 
.MapToStoredProcedures(s => 
s.Update(u => u.HasName("modify_department") 
               .Parameter(b => b.Department, "department_id") 
               .Parameter(b => b.Name, "department_name")) 
 .Delete(d => d.HasName("delete_department") 
               .Parameter(b => b.DepartmentId, "department_id")) 
 .Insert(i => i.HasName("insert_department") 
               .Parameter(b => b.Name, "department_name")));

protected void btnSave_Click(object sender, EventArgs e)
{
    string department = txtDepartment.text.trim();

    // here I want to call the stored procedure to insert values
}

我的问题是:如何调用存储过程并向其中传递参数?

共有3个答案

简景焕
2023-03-14

我用ExecuteSqlCommand

将您自己的方法(如我的方法)放在DbContext中作为您自己的实例:

public void addmessage(<yourEntity> _msg)
{
    var date = new SqlParameter("@date", _msg.MDate);
    var subject = new SqlParameter("@subject", _msg.MSubject);
    var body = new SqlParameter("@body", _msg.MBody);
    var fid = new SqlParameter("@fid", _msg.FID);
    this.Database.ExecuteSqlCommand("exec messageinsert @Date , @Subject , @Body , @Fid", date,subject,body,fid);
}

因此,您可以在代码中使用如下方法:

[WebMethod] //this method is static and i use web method because i call this method from client side
public static void AddMessage(string Date, string Subject, string Body, string Follower, string Department)
{
    try
    {
        using (DBContext reposit = new DBContext())
        {
            msge <yourEntity> Newmsg = new msge();
            Newmsg.MDate = Date;
            Newmsg.MSubject = Subject.Trim();
            Newmsg.MBody = Body.Trim();
            Newmsg.FID= 5;
            reposit.addmessage(Newmsg);
        }
    }
    catch (Exception)
    {
        throw;
    }
}

这是我的SP:

Create PROCEDURE dbo.MessageInsert

    @Date nchar["size"],
    @Subject nchar["size"],
    @Body nchar["size"],
    @Fid int
AS
    insert into Msg (MDate,MSubject,MBody,FID) values (@Date,@Subject,@Body,@Fid)
    RETURN

希望这对你有帮助。

郭俊人
2023-03-14

只需创建一个与存储过程返回的结果具有相同属性名的对象。对于以下存储过程:

    CREATE PROCEDURE [dbo].[GetResultsForCampaign]  
    @ClientId int   
    AS
    BEGIN
    SET NOCOUNT ON;

    SELECT AgeGroup, Gender, Payout
    FROM IntegrationResult
    WHERE ClientId = @ClientId
    END

创建一个如下所示的类:

    public class ResultForCampaign
    {
        public string AgeGroup { get; set; }

        public string Gender { get; set; }

        public decimal Payout { get; set; }
    }

然后通过执行以下操作调用该过程:

    using(var context = new DatabaseContext())
    {
            var clientIdParameter = new SqlParameter("@ClientId", 4);

            var result = context.Database
                .SqlQuery<ResultForCampaign>("GetResultsForCampaign @ClientId", clientIdParameter)
                .ToList();
    }

结果将包含一个ResultFor运动对象的列表。您可以根据需要使用任意多的参数调用SqlQuery

华坚成
2023-03-14

您可以在DbContext类中调用存储过程,如下所示。

this.Database.SqlQuery<YourEntityType>("storedProcedureName",params);

但是,如果存储过程返回多个结果集作为示例代码,那么您可以在MSDN上看到这篇有用的文章

具有多个结果集的存储过程

 类似资料:
  • 好吧,我知道我对C#和MVC还很陌生,但我正在尝试使用代码优先的方法向数据库中添加项。 现在,我已经成功地为数据库创建了新条目,但当我转到SQL Server时,却找不到数据库或表。 因此,我的问题是,这些数据存储在哪里,因为我无法在SQL Server中看到它,就像我手动创建的其他数据库一样? 我的ConnectionString是:

  • 问题内容: 我已经在MySQL中创建了存储过程,并希望PHP调用该存储过程。做这个的最好方式是什么? -MySQL客户端版本: 4.1.11 -MySQL服务器版本:5.0.45 这是我的存储过程: 调用过程getTreeNodeName的PHP代码是什么? 问题答案: 我现在通过使用代替找到了解决方案。 我发现许多人似乎在使用时遇到了问题。

  • 因此,我使用实体框架的“代码优先”方法,并且我有映射文件来映射表信息并添加诸如验证之类的内容,例如: 这是在使用Fluent API,我想知道如何通过字符串而不是T.AccountName获得属性名。我想动态设置这些属性,但我不知道如何通过编程实现。

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • [将代码优先DbContext与实体框架5.0 RC一起使用] DbUpdateException:更新条目时出错 我需要能够将这些父类保存到数据库中,因为它们是唯一的,即使它们有时包含已存储的导航属性-我如何从这个子主键冲突中保存父类?

  • 问题内容: 我想建立这样的关系(一个区域在x个其他区域的附近) 不幸的是,这是行不通的,因为EF生成的FK不正确…我如何才能使像这样的结构起作用? 3个区域的示例:3 Zones: Zone 1, Zone 2, Zone 3 Zone 1 Neighours: Zone 2, Zone 3 Zone 2 Neighbours: Zone 1 Zone 3 Neighbours: Zone1 有什