2017-05-06 72 views
3

我正在使用实体框架数据库第一种方法将项目从Webforms转换为MVC应用程序,并使数据库随所有存储过程一起就绪。实体框架数据库第一种方法中的存储过程

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

例如,存在具有以下列的Employee表:

EmpId, FirstName, LastName, Age, Salary 

我有一个存储过程GetAllEmpDetails已以下选择查询。

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

现在,当我试图与Employee类有5个属性,每个表结构此存储过程的结果进行绑定,然后我得到一个错误,对于Age属性值预期,但它是在结果集中不可用。

我知道没有FullName属性,所以我的问题是如何解决这个问题与生成的模型类(在这种情况下Employee),以便它可以解决这些动态?

+0

请张贴一些代码 –

+0

@JayakrishnanGounder:其实这个问题更多的是与实体框架 –

回答

5

如何映射EF存储过程?

既然你是做数据库第一种方法和你有一个EDMX文件,让EF生成类为您的存储过程的结果。您可能有许多存储过程,并且希望避免手动创建类:毕竟这是使用ORM工具的关键。还有一些存储过程可能有参数。按照以下方式进行处理将为您处理所有问题。 其实很简单。

为了得到EF为你做这个,按照步骤如下:

  1. 双击您的EDMX文件
  2. 从数据库中选择更新模型

你会看到对话框类似如下:

enter image description here

  1. 确保您已勾选如图所示的方框。

这将增加存储过程,你会看到它在你的模型浏览器中,如下图所示:

enter image description here

  • 如果你想更改类EF自动生成的名称然后这样做。我强烈建议你这样做,并为您的课程提供遵循.NET命名约定的有意义的名称。我遵循的约定是从存储过程名称中删除任何动词并将结果附加到结尾。所以,你将最终名称,如下图所示:
  • enter image description here

  • 按OK

  • 一些注意

    这比手动编写类要好得多,以防您的存储过程名称或参数存在编辑或结果返回更改。这种方法也适用于用户定义的功能。

    一个疑难杂症

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

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

    非常感谢您的答复。我遵循同样的方法,但是我没有创建一个新的复杂返回类型,而是选择了实体(本例中为_Employee_),然后在使用_Employee_类属性映射select查询时产生了问题。因此,如果我想使用EF生成的模型并使用存储过程返回某些内容,那么它应该是相等的,否则它会抛出错误。 由于我的项目有超过100个表,所以我将有额外的100个类来处理存储过程。他们不能使用现有的模型吗? –

    +0

    为什么你关心课程的数量?它们是由EF自动生成的? – CodingYoshi

    +0

    如果您的存储过程返回的某些属性与您的某个实体具有相同的属性,则可以在上图步骤5中选择该实体。 – CodingYoshi

    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"); 
    
    +0

    的方法,而不是编码问题你可能要添加'FullName'上的[NotMapped]'属性_否则EF试图从数据库表中获取该属性(它不存在.....) –

    +0

    我只是将它写在notepad ++上,它没有被测试,它是如何解决它。 –

    相关问题