我正在使用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
),以便它可以解决这些动态问题?
答案 0 :(得分:12)
如何在EF中映射存储过程?
由于您正在执行数据库优先方法并且您有一个EDMX文件,因此让EF为您生成存储过程结果的类。您可能有许多存储过程,并且您希望避免手动创建类:毕竟这是使用ORM工具的全部要点。您的某些存储过程也可能包含参数。按照以下方式进行,将为您处理所有这些。 实际上非常简单。
要让EF为您执行此操作,请按照以下步骤操作:
您将看到类似于下面的对话框:
这将添加存储过程,您将在模型浏览器中看到它,如下所示:
一些笔记
这比手动编写类要好得多,以防您的存储过程名称或所需的参数或返回的结果发生变化。这种方法也适用于用户定义的函数。
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(创建,更新,删除)操作。
我遵循的步骤(对于我来说,这个概念尚不明确,但是按照我的要求有效),但是我希望它也可以对其他人有所帮助:
使用数据库优先方法添加了ADO实体数据模型。
使用“带有EF视图的MVC5控制器”选项为我的实体添加了一个新控制器。
对于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");
}