MVC 5,EF 6和"来自数据库的代码优先"存储过程

时间:2016-06-29 19:54:03

标签: c# entity-framework stored-procedures asp.net-mvc-5

在搜索答案时,即使使用关键字" Code First from Database"在引号中,我发现答案没有涉及具体的术语,因此我特别强调了#34; Code First from Database"只要。

在使用Entity Framework 6的ASP.NET MVC 5 Web应用程序中,我希望能够使用" ADO.NET实体数据模型"向导映射到数据库上的现有存储过程。

为什么我会问这个问题以及我希望完成什么?

此特定存储过程是参数化查询,其中用户(在视图中)将通过表单提交日期范围并在表中接收该查询的结果。在SQL Server端,很容易:声明两个日期并获取查询结果。

我希望用户,从视图到"简单地"选择一个日期范围,并查看存储过程查询提供的紧接下面的结果。

下面是显示我尝试使用向导映射存储过程的屏幕截图。

1。指定数据库上下文的名称

Specify name of database context

2。在数据库中指定"代码优先"

Specify "Code First From Database"

第3。选择数据库连接

Choose Database Connection

4。没有可用的存储过程

我还注意到导入存储过程的选项是灰色的。

No stored procedures are available

4 个答案:

答案 0 :(得分:3)

编辑:Tarun提到由于缺少权限,存储过程没有显示出来。

实体框架提供API来调用存储过程,但您甚至可以将存储过程映射到模型。

查看此链接: https://msdn.microsoft.com/en-us/data/dn468673.aspx

将模型绑定到存储过程:

 modelBuilder.Entity<Blog>().MapToStoredProcedures();

如果您对映射存储过程不感兴趣,请参阅以下文章:

How to call Stored Procedure in Entity Framework 6 (Code-First)?

答案 1 :(得分:3)

我的问题的直接答案是我无法欺骗向导导入存储过程。

相反,这是我需要做的事情:

  1. 确保我的存储过程具有int
  2. 类型的ID列
    SELECT DISTINCT ID = cast(ROW_NUMBER() OVER (
                  ORDER BY z.Campus,
                      z.StudentName,
                      z.StudentID
                  ) AS INT),
          -- ....
    
    1. 在Models文件夹中,手动创建我的类和属性定义。
    2. public class PerfOdomoeterDate
      {        
        public int ID { get; set; }
        public string Campus { get; set; }
        public string StudentName { get; set; }
        public int StudentID { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public double Credits { get; set; }
      }
      
      1. 在数据库上下文文件中,添加:
      2.   

        public virtual DbSet<PerfOdomoeterDate> PerfOdomoeterDates { get; set; }

        1. 不要向“OnModelCreating”函数添加任何内容。

        2. 右键单击Controllers文件夹和新的脚手架项:“带有实体框架的MVC 5控制器”。

        3. 显示的索引操作是“hello world”示例,以确保与存储过程建立基本联系。我肯定会使用视图模型,参数等对其进行自定义。但这应该清楚地说明如何使代码工作。

        4. private PerformanceContext db = new PerformanceContext();        
          
          [HttpGet]
          public ActionResult Index()
          {   
            // These will be filled by form submission
            DateTime d1 = Convert.ToDateTime("12/1/2014");
            DateTime d2 = Convert.ToDateTime("5/1/2015");
          
            // supply parameter values required by the stored procedure
            object[] parameters = {
                new SqlParameter("@date1",SqlDbType.DateTime) {Value=d1},
                new SqlParameter("@date2",SqlDbType.DateTime) {Value=d2}
                             };
          
            // populate the list by calling the stored procedure and supplying parameters
            IEnumerable<PerfOdomoeterDate> query = 
                db.Database.SqlQuery<PerfOdomoeterDate>("PerfOdomoeterDate @date1, @date2", 
                    parameters).ToList();            
          
            return View(query);
          }
          
          1. 重建并查看索引。应该没有编译或运行时错误。视图应显示所需数据。

答案 2 :(得分:2)

权限。(确保db用户具有存储过程的权限

答案 3 :(得分:1)

我不相信你可以从向导那里做到这一点,从存储过程生成是一个相对较新的功能。

要从代码映射到proc,您需要执行以下操作

modelBuilder 
  .Entity<Blog>() 
  .MapToStoredProcedures();

完整的详细信息在这篇文章中

https://msdn.microsoft.com/en-us/data/dn468673.aspx