Entity Framework数据库中的存储过程第一种方法

时间:2017-05-06 13:29:30

标签: c# entity-framework stored-procedures

我正在使用Entity Framework数据库第一种方法进行从Webforms到MVC应用程序的项目转换,并准备好数据库以及所有存储过程。

我成功创建了一个.edmx文件,并且能够使用我的存储过程,并且在执行任何插入或更新操作时效果很好。但是当我在我的一个存储过程中使用select查询时出现了真正的问题。

例如,有一个Employee表,其中包含以下列:

EmpId, FirstName, LastName, Age, Salary

我有一个存储过程GetAllEmpDetails,其中包含以下选择查询。

Select 
    EmpId, (FirstName + ' ' + LastName) as FullName, Salary 
from 
    Employee

现在,当我尝试将此存储过程的结果与具有5个属性的Employee类绑定时,根据表结构,我得到一个错误,Age属性的值是预期但在结果集中不可用。

我知道也没有FullName属性,所以我的问题是如何用生成的模型类解决这个问题(在本例中为Employee),以便它可以解决这些动态问题?

3 个答案:

答案 0 :(得分:12)

如何在EF中映射存储过程?

由于您正在执行数据库优先方法并且您有一个EDMX文件,因此让EF为您生成存储过程结果的类。您可能有许多存储过程,并且您希望避免手动创建类:毕竟这是使用ORM工具的全部要点。您的某些存储过程也可能包含参数。按照以下方式进行,将为您处理所有这些。 实际上非常简单。

要让EF为您执行此操作,请按照以下步骤操作:

  1. 双击您的EDMX文件
  2. 从数据库中选择更新模型
  3. 您将看到类似于下面的对话框:

    enter image description here

    1. 确保您已选中显示的框。
    2. 这将添加存储过程,您将在模型浏览器中看到它,如下所示:

      enter image description here

      1. 如果要更改EF自动生成的类名,请执行此操作。我强烈建议您这样做,并为您的类提供符合.NET命名约定的有意义的名称。我遵循的约定是从存储过程名称中删除任何动词,并将结果一词附加到结尾。所以你最终会得到名字,如下所示:
      2. enter image description here

        1. 按OK
        2. 一些笔记

          这比手动编写类要好得多,以防您的存储过程名称或所需的参数或返回的结果发生变化。这种方法也适用于用户定义的函数。

          A Gotcha

          有时候,存储过程不会出现在向导对话框中的选择中,这是因为this。只需将其添加到存储过程的开头:

          SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done.
          

答案 1 :(得分:0)

public class EmployeeProcedure
{
    [Column("EmpId")]
    public int EmployeeId { get; set; }

    [NotMapped]
    public string FullName { get; set; }

    public double Salary { get; set; }
}

之后打电话给:

this.Database.SqlQuery<EmployeeProcedure>("GetAllEmpDetails");

答案 2 :(得分:-1)

我通过解释清楚的link来实现它 在数据库优先方法中为实体使用存储过程进行CUD(创建,更新,删除)操作

我遵循的步骤(对于我来说,这个概念尚不明确,但是按照我的要求有效),但是我希望它也可以对其他人有所帮助:

  1. 使用数据库优先方法添加了ADO实体数据模型。

  2. 使用“带有EF视图的MVC5控制器”选项为我的实体添加了一个新控制器。

  3. 对于DeleteConfirmed()函数,我做了如下较小的更改:

     [HttpPost, ActionName("Delete")]
     [ValidateAntiForgeryToken]
     public ActionResult DeleteConfirmed(int eid,bool isdeletede)
     {
         emp emp1 = db.emp.Find(eid,isdeletede); //Composite Key in my Entity: Emp
         //  db.emp.Remove(emp_sd1);         
         db.sp_deleteempt1(eid);    //I excluded Remove() and invoked my  Stored Procedure & it worked well for me
    
         db.SaveChanges();
         return RedirectToAction("grpindex");
     }