MVC 简单框架起步-数据(一)

         说来惭愧,毕业四年,现在才开始着手框架的事情,着实脸红,之前都是拿来主义,这几年来跳过两次槽,从一个菜鸟小白到资深小白,新业务,新领域,新技术都有所接触,工作上能应付的来。从最开始读了一本《 JaveScrit Dom 编程艺术》,便觉 js在手,前端我有。等读完《锋利的Jquery》,还是 Jquery 更香一些。到后来的 Vue ,Element 等等,书读的越多,用的越多,越是觉得自己还止步于山脚。每每开发完一个模块,一个项目带来的不是成就感,而是不少遗憾。总觉得再给我一次重来的机会,我就会怎样怎样,如何如何,绝不会如此设计,总想着推到重来,最后却停在口头上,寄托在下一个项目。做开发越久,越觉得思想最重要,理清头绪,设计好思路比一开始就迫不及待去下手要好的多。实习那会拿到任务总想赶紧做完,立马下手。那时很多都未考虑周全,出过一些问题,算上后期填坑的时间,花费的总时间更多。时间真的要靠挤,不然他就悄悄溜走。忙不完的项目,还有考试,不然真没多的时间来写随笔和更新GitHub。趁着下一个项目还没开始,记录一下

        为什么要有框架,MVC项目自带不是有model,view伪三层吗? 其实框架说白了是分层,分层的目的是解耦,为了方便拓展。分层有 数据层,业务层,模型层,接口层, Web层 等等,并不是层越多越好,要根据实际业务考虑,不要纠结层数,分层只是手段。比如我就一个小小个几百上千的用户量,分个七八层让人看得眼花缭乱,真是没必要。项目第一步,便是数据库设计这一块,有原生ado.net 和 ORM 映射,ORM中EF占据主流,其中EF 又有DbFirst、ModelFirst,CodeFirst ,根据不同的项目选择访问数据的方式,没有所谓的高端低端,第一实现功能,然后是稳定,高效。这里记录一下 EF ,关于EF 很多人都 看不起 DbFirst ,觉得 CodeFirst才是王道。实际并非如此。对于开发周期短的小项目,这里使用Dbfirst 就很是方便,尤其如服务, 只基于现有的数据库中某几个表进行操作,并非所有表。使用 DbFirst 会有一个疑问,edmx 文件到底算哪一层呢,分到 模型层吧,它又有 继承 DbContext 的类,new一下这个类就可以获取实体表数据,把它分到数据层吧,它又有表对应的实体类,真是纠结,上网百度一下,也没什么好的解决方式,有说新建两个edmx的,一个删除 实体,一个删除contenxt ,仔细想想,觉得很别扭。我想的是,只把它作为模型层,然后注释或者删除继承 DbContext 的类文件,然后在其DLL数据访问层 中重写此类,当然也可以复制过去。这样一来,看起来顺眼多了。

        对于CodeFist 我接触晚一些,在我们开发项目的时候,很多时候数据库已经存在,从0到1的项目并不是很多。一方面是狭隘的认为有了数据库,CodeFirst 就没有用武之地了,另外一方面觉得修改表结构需要通过指令来操作太麻烦,也不安全,实则不然,自EntityFrameWork6.0以后,新建项-选择实体时会出现一个 来自CodeFist的项,这里就是方便在已经存在数据库的情况下,很方便的使用CodeFist,点击这个,下一步,下一步,选择所在的数据库,便会创建所选的实体                

                                          

当然这些实体属于模型层,在数据访问层中(安装 EntityFramework), 执行相关Nuget 指令即可,主要指令如下

1. Enable-Migrations 启用一个映射

2. Add-Migration InitialCreate -IgnoreChanges 添加一个映射,忽略数据库变化(不对数据库多更改)

3. Add-Migration xxxx  表结构有变化时执行下

4. Update-Database  更新数据库

基于现有数据库的情况,若不做表结构改动,依次执行1,2,4。 当表结构有改动的时候(数据库迁移),依次执行 1,2,3,4 .  关于CodeFirst 网上的资源要比 DbFist多得多,百度一下,内容很丰富,不知为何念书的时候,任课老师只教了DbFist. 这里记录一下数据库的操作,

既然用到了EF,自然是免不了执行效率的考量,EF 监听生成的SQL,操作如下

1.下载 MiniProfiler.EF6 包,然后选择对应的版本

2. 在全局文件中,加入执行指令

        protected void Application_Start()
        {
            LogHelper.WriteInfo(" 开始..");

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
          
            //注册EF 追踪
            MiniProfilerEF6.Initialize();
        }

        protected void Application_BeginRequest()
        {
            MiniProfiler.Start();
        }

        protected void Application_EndRequest()
        {
            MiniProfiler.Stop();
        }

3. 在 Web.Config 中加入对应配置

  <system.webServer>
    <handlers>
      <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
    </handlers>
  </system.webServer>

4. 在所需要监控的界面 中加入配置,当然可以放在母版页,这样处理更方便点

    @using StackExchange.Profiling;
    @MiniProfiler.RenderIncludes()

如此,运行到界面上,便可以查看所生成的SQL 语句,以及执行时间,之前以为 SQL 自带的那个 Profiler 监听是万能的,后来发现只能监听原生的 ADO.net 语句,对EF 操作望尘莫及.

接下来,尽量完整的记录下框架的一点点皮毛

原文地址:https://www.cnblogs.com/Sientuo/p/13209046.html