我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分:

为什么要使用Code First:

近 年来,随着domain driven design的推广,以前那种先建好数据库,然后再编写代码的方式受到了越来越多的质疑。因为使用这种开发方式很难适应领域内业务逻辑的改变,它需要当每 次领域发生改变的时候,先改变数据库,然后再改变业务逻辑和实体的代码,开发周期比较长,而且不利于单元测试。所以随着domain driven design一同推广的还有Persistence Ignorance 原则和POCO(Plain Old CLR Object). Persistence Ignorance principle说白了就是把domain driven design中的实体,值对象,服务与数据存储功能完全隔离,使他们不掺杂任何与数据存储相关的代码。在随后的实例中,大家可以看到如何通过Code First实现这些。

所谓的Code First就是先写业务逻辑部分的代码,实现domain driven design当中的实体,值类型和服务,然后通过Code First默认的习惯或者配置把他们映射到数据库中去。这样做一方面可以让我们先把全部的精力投放到业务逻辑的设计和实现中,并且可以在实现业务逻辑后, 使用一些Mock工具单独对业务逻辑代码进行测试。另一方面,当我们对业务逻辑进行proof-of-concept时,可以通过几个简单的界面就可以做 出prototype去给客户演示了。通过使用Code First方式,使我们能更快的对应业务逻辑的改变和原型搭建。所以Code First非常适用于使用domain driven design的新建项目使用。

关于使用Code First的好处以及使用它的场合,相信通过前面的介绍大家已经清楚了,还是让我们回到代码,通过最简单的一个实例程序看看Code First是怎么按照他的约定来实现数据库的映射的。

Code First遵循的是Convention over Configuration的原则,也就是说如果你对领域中的各类对象的映射没有进行配置的话, Code First就会按照他的默认习惯进行领域对象与数据库的映射。

我在本系类的日记中使用的实例是给公司内部新员工培训使用的一个简单的订单管理系统,包含客户,订单,订单条目,产品,产品目录等实体和值对象。

让我们先考虑最简单的产品目录吧,假设我们的产品目录是一个值对象包含以下属性:

public class ProductCatalog
    {
        public int ProductCatalogId { get; set; }
        public string CatalogName { get; set; }
        public string Manufactory { get; set; }
        public decimal ListPrice { get; set; }
        public decimal NetPrice { get; set; }
    }

怎么才能够让Entity Framework认识你定义的值对象并且把它映射成数据库中的表呢?你需要定义一个继承DbContext类的子类,然后在这个子类中添加一个泛型DbSet的属性,类型参数就是你自定义的ProductCatalog类。

public class OrderSystemContext:DbContext
    {
        public DbSet<ProductCatalog> ProductCatalogs { get; set; }
    }

然后你可以使用你定义的OrderSystemContext类进行数据操作了。

var context = new OrderSystemContext();

var catalogs = context.Catalogs.Where(c => c.ProductCatalogId == 1);

现在就让我们来介绍一下Entity Framework Code First中的映射习惯吧。

1. 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。当然后边会介绍怎么进行配置。

2.表映射:Code First 默认会按照类型名复数建立数据表,比如说ProductCatalog类对应的表名就叫ProductCatalogs.后边会介绍如何改变默认的表名。

3.
列映射:Code First
默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为
nvarchar(max),decimal会映射为decimal(18,2)。后边会介绍如何更改column的名称,类型以及其他特性。

4.主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。这些也是可以改的。

这个程序执行完之后就会在默认的SQL Expression中建立一个名为xxx.OrderSystemContext的类,并且建立一个名字为ProductCatalogs的表,表的具体结构如下:


然,我们既然使用domain driven
design就完全应该按照我们领域中的实际业务情况设计我们的类,这样就不可能使我们的类完全遵守Code
First的习惯,接下来的学习日记将主要具体介绍如何通过Code First的配置功能将我们领域中各种各样的类和类之间的关系映射到数据库中。

http://www.cnblogs.com/lk8167/archive/2013/01/07/2849443.html

Entity Framework Code First 学习日记(1)精的更多相关文章

  1. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  2. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  3. Entity Framework Code First 学习

    1.添加entityframework 项目-管理解决方案的 NuGet 程序包-联机-Entity Framework 2.code first Migration 工具->库程序包管理器-& ...

  4. Entity Framework Code First (一)Conventions

    Entity Framework 简言之就是一个ORM(Object-Relational Mapper)框架. Code First 使得你能够通过C#的类来描述一个模型,模型如何被发现/检测就是通 ...

  5. Entity Framework Code First约定

    Code First使你能够通过C# 或者 Visual Basic .NET来描述模型,模型的基本规则通过使用约定来进行检查,而约定就是一系列内置的规则. 在Code First中基于类的定义通过一 ...

  6. Entity Framework Code First实现乐观并发

    Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...

  7. Entity Framework Code First数据库连接

    1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...

  8. Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  9. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

随机推荐

  1. rar自动压缩备份

    rem ******MySQL backup start********@echo offforfiles /p "D:\备份\发布软件备份" /m backup_*.sql -d ...

  2. Gitbash如何支持交互式命令?如何让gitbash的命令不乱码?winpty是什么鬼?干嘛用的?

    winpty 是一个 Windows 软件包,提供了类似 Unix pty-master 一样的接口,用于实现控制台程序之间的通讯.该软件包包括一个开发库 (libwinpty) 和一个用于 ygwi ...

  3. 【cf789B】Masha and geometric depression(分类讨论/暴力)

    B. Masha and geometric depression 题意 在黑板上写数列,首项是b,公比是q,超过l时就停止不写.给定m个数,遇到后跳过不写.问一共写多少个数,如果无穷个输出inf. ...

  4. 最小表示法模板(洛谷P1368 工艺)(最小表示法)

    洛谷题目传送门 最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串. 因为是环状的,所以肯定要先转化为序列,把原串倍长. 设决策点为一个表示法的开头.比较两个决策 ...

  5. IntelliJ IDEA快捷键总结

    原文: IntelliJ IDEA快捷键 下面只列出Windows系统下的快捷键,Mac下的快捷键参考上面的链接. Remember these Shortcuts 功能 快捷键 Smart code ...

  6. luogu4145 上帝造题的七分钟2 (线段树)

    题意:给一个数列,维护两个操作,区间开根号.询问区间和 注意到1e12开根号六次后就变成1,而且根号1等于1 也就是说,就算我们用单点修改,只要跳过1,那么修改的次数最多也就是6n 那么维护一个区间最 ...

  7. Markdown基础(内含:锚点使用,使用HTML,新页面跳转,目录生成)

    Github样式显示参考:点我 之前说过用word写文章,这次说说Markdown写文章(推荐) 逆天推荐使用VSCode编写 装这个插件写作更方便: 内含:锚点使用,使用HTML,新页面跳转,目录生 ...

  8. 10张图带你深入理解Docker容器和镜像

    http://dockone.io/article/783 [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. Doc ...

  9. A1141. PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  10. mybatis的一种批量更新方法【我】

    接手一个项目,项目主要架构用的 servlet 3.0 + spring + mybatis 其中发现一个问题: 操作数据时,批量插入可以,批量更新,使用各种写法都无法成功,直接报 mybatis转换 ...