首页 > 代码库 > 初学C#和MVC的一些心得,弯路,总结,还有教训(2)--关于Entity Framework
初学C#和MVC的一些心得,弯路,总结,还有教训(2)--关于Entity Framework
---恢复内容开始---
看了一堆视频教程后,感觉基本了解的差不多了,可以动手.....因为最好的学习方法就是实践嘛....
所以打算从网站做起,在WebForm和MVC之间选了MVC,因为感觉高大上...也比较灵活
于是买了两本书《ASP.NET MVC 4高级编程(第4版)》和《ASP.NET MVC 4 Web编程》,在群里有群友问,为什么要买两本...其实这是习惯啦...对于初学者来说,最先要了解的就是,这个东西大概是个什么东西....书的作者不同,介绍的侧重点也不同,买两本就为了互补一下...
mvc也大概看了一下,至少基本的控制器,试图啊,还有整个的流程都了解的差不多,准备动手了....
先说说在选择数据库访问技术上遇到的问题.....
看的教程,基本上数据库都是用EF来做的...于是也跟着用了微软官方出品高大上的Entity Framework....
Codefirst神马的太遥远,于是先打开sqlserver建库,然后写model...然后兴高采烈的就开始了...
然后不出意外的就遇到问题了
1.在深入理解完全面向对象的数据库设计方法之前,思路还是局限在sql时代(毕竟写了很多年的sql语句),这就直接导致了数据库表和Model设计的不合理
于是就有了下面的Model (省略了部分无关字段)
菜单ID,父菜单ID,菜单名字,父菜单名字......
使用的时候根据ParentCode获取到父菜单的MenuName 填充到 ParentName
public class Menu { [Key] public int MenuCode{ get; set; } public int ParentCode { get; set; } public string MenuName { get; set; } [NotMapped] public string ParentName { get; set; }
于是就有了这段 自连接(自己Join自己) 查询代码....
var query = from a in DB.Menus join b in DB.Menus on a.ParentCode equals b.MenuCode into lg from b in lg.DefaultIfEmpty() select new SDOU.Models.Staff.Menu { MenuCode =a.MenuCode , MenuName =a.MenuName, ParentCode =a.ParentCode , ParentName = b == null ? "" : b.MenuName };
啪嚓一运行,问题又来了....
我的Model明明是放在 Models.Staff.Menu ,运行的时候 EF非要给我整到DAL的命名空间下,然后告诉我无法关联实体还是什么的....总之就是自动给我把命名空间给换了.....
对于新手的我,在百度谷歌捣鼓半天也没解决问题...
后台求助大神,大神曰,你这一看就知道有问题,不是EF的问题,而是你自己的思路问题....这是在拿着EF写SQL.......(其实我想说,那当然了,我只会sql嘛).....然后大神又说,初学者如果没有面向对象的设计思想,就老老实实回去用sql吧....
既然大神的指点了,我也不去纠结到底是哪里的问题了,就算把这个命名空间问题搞定,以后用EF肯定还会遇到更多问题....这种自己连接自己的简单查询都搞不定,以后那些横跨多个表的复杂查询就更不用说了....
于是乎各方求助,百度谷歌一番知道了几个轻量级的微型ORM框架... PetaPoco,Dapper,FluentData,DataRabbit这几个推荐的比较多,有时候没有选择还好,拿来就用了,但有选择的时候反而会更加难下决定....
于是乎,就有了这个博问 http://q.cnblogs.com/q/65659/ 让大神们帮我做个选择....
最后的结果就是弃用EF,启用Dapper
初学C#和MVC的一些心得,弯路,总结,还有教训(2)--关于Entity Framework