繁体   English   中英

MVC 5,EF 6和“数据库中的代码优先”存储过程

[英]MVC 5, EF 6, and “Code First from Database” Stored Procedures

在搜索答案时,即使使用引号中的“数据库中的代码优先”关键字,我发现答案没有解决具体的术语,所以我只是特别强调“数据库中的代码优先”这个问题。 。

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

我为什么要问这个问题,我希望完成什么?

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

我希望用户从View中“简单地”选择一个日期范围,并查看由存储过程查询提供的紧接在下面的结果。

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

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

指定数据库上下文的名称

2.指定“代码优先于数据库”

指定“代码优先于数据库”

3.选择数据库连接

选择数据库连接

4.没有可用的存储过程

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

没有存储过程可用

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

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

请访问此链接: https//msdn.microsoft.com/en-us/data/dn468673.aspx

要将模型绑定到存储过程:

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

如果您对映射存储过程不感兴趣,请参阅此帖子:

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

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

相反,这是我需要做的:

  1. 确保我的存储过程具有int类型的ID列
 SELECT DISTINCT ID = cast(ROW_NUMBER() OVER ( ORDER BY z.Campus, z.StudentName, z.StudentID ) AS INT), -- .... 
  1. 在Models文件夹中,手动创建我的类和属性定义。
 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. 在数据库上下文文件中,添加:

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

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

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

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

 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. 重建并查看索引。 应该没有编译或运行时错误。 视图应显示所需的数据。

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

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

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

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

完整的细节在这篇文章中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM