在探讨系统重构的代码结构组织之前,先初步考虑框架与数据库的交互,在.net平台上数据访问方案有人总结为三类:DataSet、ADO.net 2.0、ORM组件。我只熟悉ADO.NET方式,众多的企业特性(如连接池、缓存等)均自行写代码实现,在此次重构时,我当然可以直接将原来的数据访问方案直接搬过来在Model中实现与数据层的交互,但既然考虑重构,为何不尝试一下新的ORM呢,在起初我考虑HNibernate框架的,但我在2008年的一个全国应用范围的项目中见过开发团队用Entity Framework作为数据层访问方案,一直对此方案比较好奇,所以这里采用Entity Framework 6.0.1

again, 对此有选择性障碍的人,停止寻找银弹吧,比如Entity Framework框架讨论很多的运行性能问题,我认为可用空间换时间的思路(比较粗暴的说法:硬件空间换响应时间。当然不是这样简单的概念,这里我个人喜欢这样概述此思路而已)来解决,不用钻牛角尖太深。

EF有三种方式(three ways)着手:Database First、Model First、Code First,通俗的话来说:

  • Database First:先构建数据库结构,然后通过逆向工程来自动创建数据模型和相关对象代码,最后通过这些对象来与数据库交互
  • Model First:先在VS工具中创建数据模型,然后自动生成相关对象代码及数据库,最后通过这些对象来与数据库交互
  • Code First:先在VS中创建数据对象类,EF自动转换成模型及数据库,最后通过这些对象来与数据库交互

通常分工明确的项目团队中,设计人员用ORM工具(比如我习惯用PowerDesigner)完成数据库结构的设计,然后交给开发人员进行逻辑代码的开发。 for me, 这部分工作已经完成了,整个后台管理平台的数据结构乖乖的列在数据库中了,看起来我可用Database First方式着手。

这里顺便想提一句Code First方式,这令我回想起早几年的技术销售(TS)的工作,这个角色的工作中涉及的POC要求一个快字,Code First简直就是为快而生的,用户POC需求拿到后,直接进入代码编写业务逻辑,不用花时间在数据层的处理上,最重要的是POC成功后,即使要将POC直接转化到生产环境也是可行的。

Code First方式简单的开发流程可概括如下:

  1. 直接在Model中创建代表业务实体(Entity)的类(class),以下是几个基本规则(更复杂的Entity定义规格可参阅这里)
    1. Entity(或者说数据表)的关键字默认规则:"ID" or "classsnameID"属性为关键字。当然DatabaseGenerated标签可允许自己定义关键字
    2. Entity间的一对多关联用泛型集合类型的navigation property来表示
    3. Entity类名默认是数据表名,Entity类属性默认是数据表字段名
    4. foreign key的默认定义规则:<navigation property name><primary key property name>
  2. 创建Database Context(这里除了创建数据库连接外,还将数据表与Entity关联起来)
    1. 用DbSet<T>将数据表与定义的Model类关联起来,且DbSet会完成常见的数据表CRUD操作
  3. 创建视图显示Entity对象

开发流程的核心基本就是如此,中间涉及的各种规则可参阅这里,包括数据库连接字符串规则、Entity关联规则、甚至你可以自定义规则

一句话小结三种方式的选择:Code First适合做演示系统,很多东西不用费时间考虑,Database First显然适合导入现有的数据结构,从头实施大型项目还是以模型先着手,完整的模型视图有利于理清各个对象间的关系。

确定了asp.net mvc + EF 后,接下来如何进行呢?对我来说,涉及的新技术好多哦,系统的学习是不可能的,我决定采取这样的方式进行:搜集asp.net mvc的最佳实践经验,以此为基础来展开本次重构,总体来讲从以下几个方面着手搜集

  • 代码结构的组织
  • 身份验证机制的新实现(针对我原系统而言)
  • 权限管理机制的新实现(针对我原系统而言)
  • 资源管理机制(一项具体业务,这里不详述其内容)

Microsoft 2013 新技术学习笔记 二的更多相关文章

  1. Microsoft 2013 新技术学习笔记 一

    有几年没有关注技术了,最近有点时间想把技术重新捡起来,借着重构手上的一个后台管理框架的机会将微软新的几种技术全部应用一下,从目的上来讲并没有希望能对涉及的技术有很深入的了解,所以这个系列的文章(篇幅不 ...

  2. Microsoft 2013 新技术学习笔记 三

    什么是代码结构的组织?asp.net MVC 5 默认创建出的几个目录的标准含义分别如下: Controllers目录存放MVC模式中的Controler Models目录存放MVC模式中的Model ...

  3. Microsoft 2013 新技术学习笔记 四

    在继续学习Model的实践经验之前,先思考一下Controller和View的实践原则在本次系统重构中的应用,我手上是一个后台管理系统(不是门户系统.不是具体业务系统),通俗点讲就是给企业的运维人员用 ...

  4. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  5. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  6. kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  9. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. [C++] socket -9[匿名管道]

    ::怎么弄都不能读取信息....先把代码放着.... #include<windows.h> #include<stdio.h> int main() { HANDLE rea ...

  2. 解决Eclipse Debug source not found问题

    解决方法如下:Debug 视图下-->在调试的线程上 右键单击-->选择Edit Source Lookup Path-->选择Add-->选择Java Project选择相应 ...

  3. 面试求职中需要了解的Java多线程知识

    Java中多线程的实现方式 在java的历史版本中,有两种创建多线程程序的方法 1) 通过创建Thread类的子类来实现(Thread类提供了主线程调用其它线程并行运行的机制) 主要步骤: 自定义类继 ...

  4. atitit.ajax 最佳实践跟框架选型 o99

    atitit.ajax 最佳实践跟框架选型 1. 选型框架dwr/dwr3 跟jq 1 2. DWR方便的地方分为两个地方. 1 3. dwr 优点: 1 4. 缺点: 2 5. 根jq的区别 2 1 ...

  5. paip.获取文件名从路径uapi java python php总结...

    paip.获取文件名从路径uapi java python php总结... =====uapi basename_noext($fname); =============java  自己写.. St ...

  6. paip.指针 引用 c++ java的使用总结.

    paip.指针 引用  c++ java的使用总结. ///////////////一般一个变量包括下面的信息 a.地址(指针)  b.命名(引用,别名)   c.变量内容.. 指针是一个变量的地址, ...

  7. paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)

    paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象) 1     锁的缺点 2     CAS(Compare ...

  8. paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar

    paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar 作者Attilax  艾龙,  EMAIL:1466519819@qq. ...

  9. js系列(8)简介

        JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HT ...

  10. android: 使用前台服务

    9.5.1    使用前台服务 服务几乎都是在后台运行的,一直以来它都是默默地做着辛苦的工作.但是服务的系统 优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收掉正在后台运行的服 务.如果 ...