CSDN发表文章可以复制截图,保存却丢失!十几张截图全没了,凑合着看吧,没心情也懒得编辑了!
之前一直使用devart的产品,对主流数据库Oracle、mysql、SQL Server的存储过程、实体集、函数支持都非常好。但是最近有点洁癖,不想引用太多外来组件,所以尝试着使用了传说中的“EF”(尽管之前使用的devart已经是对EF的使用了,但我这人比较懒,不习惯了解太深入的东西,知道怎么用就行了,所以对于概念性的知识非常模糊)。
如果想深入了解ADO.net实体框架的结构,网上一大堆,这里我也不懂,也不发表谬论了!
下面的例子,数据库使用的mysql,框架使用mvc4,属于半成品,凑合着看,目标是显示出全国的省份!
1、选择创建ADO.NET实体数据模型。
你需要确保Mysql的连接组件是最新的,我使用的是6.8.3,太老的版本可能不支持ado.net实体数据框架,导致在“更改数据源”时没有Mysql选项。
此处可以下载:mysql-connector-net-6.8.3.msi
接下来进行数据库的选择,一路next。
最终生成的模型浏览器样子
到此已经包含了所有表的实体映射,使用非常方便
2、使用数据表的映射实体获取所有省份
文件结构如下所示,Model1.edmx就是生成的数据库映射,而HopeContext就是以后所使用的上下文(就当成数据库使用)。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class ProvinceDAL { public static List<province> getProvince() { HopeContext context = new HopeContext(); // 获取省份表的所有数据 var result = context.provinces.ToList(); return result; } } }3、使用存储过程获取所有省份
这里我讲一下,为什么会使用存储过程。在oracle中有package的概念,专业点就是数据库的面向对象实现。以往我们习惯的把数据处理重点放在DAL层,把逻辑处理放在BLL层。但在做项目的过程中,需求随时可能改变,修改存储过程可以很方便的达到我们想要的功能,因此在项目中将业务流程、数据分析全部写在Oracle的存储过程中,并且按照包体分类,使得程序能获取经过处理后的数据。这种模式已经在一个成熟的项目中应用,并且维护确实蛮方便的。
貌似mysql5.0以上才支持存储过程,不支持的版本请自行升级。
建立存储过程,mysql的存储过程返回游标cursor非常方便,只需要最后一句话是select就可以了,这点比oracle方便太多。
DELIMITER $$ CREATE PROCEDURE getprovince() BEGIN SELECT id,p.name,'测试' PContent FROM provinces p; END$$ DELIMITER ;
从数据库更新模型
将存储过程更新下来
如果在“函数导入”中没有出现该函数,可以双击下面对应的存储过程来生成。
很遗憾,ado.net实体数据并不支持存储过程的复杂类型返回值,这也是写这篇文章的动机,因为我测试好久才解决这个问题。
首先声明目前没有资料显示可以解决自动生成存储过程返回的复杂类型实体。
双击“函数导入”下的“getprovince”
红圈里面显示了不支持该数据类型,不过没关系,选择“创建新的复杂类型”,可以修改该类型名称,选择确定并ctrl+s保存(保存会执行生成操作,将修改结果保存在edmx中)。
两个红框部分是自动生成,并且对应的。
我测试了,如果编辑“getprovince_Result.cs”是无效的。必须在视图界面编辑才行,还不知道其中的原因。
我们需要在复杂类型中,添加标量属性,命名必须与存储过程中的返回值对应,否则生成失败。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DAL { public class ProvinceDAL { public static List<getprovince_Result> getProvince() { HopeContext context = new HopeContext(); // 通过存储过程获取省份表的所有数据 var result = context.getprovince().ToList(); return result; } } }Controller:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using DAL; namespace Hope.Controllers { public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "修改此模板以快速启动你的 ASP.NET MVC 应用程序。"; var models = ProvinceDAL.getProvince(); return View(models); } public ActionResult About() { ViewBag.Message = "你的应用程序说明页。"; return View(); } public ActionResult Contact() { ViewBag.Message = "你的联系方式页。"; return View(); } } }View:
@model List<DAL.getprovince_Result> @{ ViewBag.Title = "主页"; } @section featured { <section class="featured"> <div class="content-wrapper"> <hgroup class="title"> <h1>@ViewBag.Title.</h1> <h2>@ViewBag.Message</h2> </hgroup> <p> 若要了解有关 ASP.NET MVC 的详细信息,请访问 <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>。 该页提供 <mark>视频、教程和示例</mark> 以帮助你充分利用 ASP.NET MVC。 如果你对 ASP.NET MVC 有任何疑问,请访问 <a href="http://forums.asp.net/1146.aspx/1?MVC" title="ASP.NET MVC Forum">我们的论坛</a>。 </p> </div> </section> } <ul> @foreach (var item in Model) { <li>@item.name</li> } </ul>