我最近几天正在学习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. 简单聊聊WebSocket

    一.概述 上一篇文章<浅析一次HTTP请求>我们分析了简单的一次 HTTP 请求具体是怎么样完成的,分析了 HTTP 协议的数据结构,如何连接,如何断开,又是如何多路复用的,那么今天我们来 ...

  2. [luogu3810][bzoj3262]陌下花开【cdq分治】

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示.现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅Sa&g ...

  3. 使用Coverage进行代码覆盖率的测试

    软件测试实验报告 一.实验目的: 使用软件测试代码覆盖率. 二.实验工具: Windows10.Python3.6.3.Coverage. 三.实验内容: 1.编写准备测试的代码main.py和测试代 ...

  4. luogu3621 城池攻占 (倍增)

    好像所有人都写的左偏树 但我不会啊233 首先发现乘的时候 系数不会为负,所以能得到一个关键条件:变化后的战斗力随变化前的战斗力大小单调 所以我们考虑倍增 设hp[x][i]是从x开始一路攻克$2^i ...

  5. [NOI2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  6. NOI2017蔬菜(贪心)

    小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案. 在蔬菜仓库中,共存放有 n 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各 方面因素,设计合理的销售方案,以获得最多的收益. 在计算销售蔬菜的 ...

  7. Windows Update第三方工具概览

    受方程式黑客组织0Day攻击影响,所有的Windows服务器都要更新补丁. 方程式0day漏洞攻击介绍:https://zhuanlan.zhihu.com/p/26375989 腾讯云的解决方案:h ...

  8. Docker中如何删除image(镜像)

    原文地址:http://yaxin-cn.github.io/Docker/how-to-delete-a-docker-image.html docker中删除images的命令是docker rm ...

  9. macOS在virtualenv中使用wxPython报错

    在虚拟的Python环境中运行GUI的软件报错 This program needs access to the screen. Please run with a Framework build o ...

  10. Vim auto-pairs设置选项

    let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"'} 设置要自动配对的 ...