一个业务领域由各个实体和各个相互关联且有格子的属性和行为的实体组成,每个实体都有其状态和验证规则需要维护,Entity Framework (后面简称EF)实体框架设计的出现是为了允许开发人员着重关注业务领域,开发人员就实体来建模。它产生的目的是为了解决企业快速开发和迭代出市场所需要的系统或者软件。下面我们介绍Entity Framework 中的三种领域建模方式。

1、Code First

Code First 可以通过C#或者VB.NET 来描述这些模型,然后通过类来创建数据库。这些类简称POJO(Plian Old CRL Object)。POCO来源于Java的POJO,其中J就是Java,POJO是由马丁·富勒(Martin Fowler) 和其他人一同提出来的概念以反对在20世纪90年代早期受欢迎的JavaBeans。POJO概念提出的主要目标是显示域可以被成功建模,而不会带来与执行环境相关的复杂表(JavaBeans在早期版本中带来了很多),同时执行环境与域建模完全无关。POJO不能再.NET中使用,因此有了具备POJO相同语义 的POCO。这里的C指的是(Common Language Runtime,CLR通用语言运行时)中创建的一个简单对象。EF 4.0之前生成的每个类都是从EntityObject基类继承而来的,因此带来了许多特定于EF的复杂性。而从EF 4.0开始,框架引入了POCO数据模型,允许使用不从EntityObject继承的类。使用Code First 模型可以完全以面向对象的方式来工作而不必担心数据库的结构,这种抽象使我们能够创建更加灵活的应用程序。其优点如下:

1)、这是最受欢迎的领域建模方式,可以允许我们创建一个更富有的逻辑、更灵活的应用程序;

2)、因为没有自动生成的代码是难以修改的,所以它提供了我们对代码的 完全控制;

3)、通过这种方法我们只需要定义映射,其余一切交给EF来处理,包括创建数据库表以及表与表之间的关系;

4)、这种方式可以通俗易懂的成为代码定义数据库,所以不推荐对数据库的手动修改;

5)、我们可以使用它来映射表结构到一个已存在的数据库。

        栗子:VS2017 --->新建一个MVC项目--->右击项目引用--->管理NeGet程序包--->浏览搜索EntityFramework--->安装

       然后在Models中添加两个类 Student和Class 表示学生表与班级表

  建立一个数据库上下文类 配置数据库链接字符串 在Home控制器里面测试看看 

 <connectionStrings>
<add name="SqlConn" connectionString="Data Source=地址;Initial Catalog=BaseTestEF;User ID=sa; Password=密码;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings 
using System.Linq;
using System.Web; namespace EF3Class.Models
{
public class WYDB :DbContext
{
public WYDB() : base("SqlConn")
{
//默认的初始化器。这种初始化器在第一次运行程序时会创建数据库,再次运行不会再创建新的数据库。但是如果我们改变了领域类,运行程序时会抛出一个异常
//Database.SetInitializer(new CreateDatabaseIfNotExists<DbContextWY>()); //如果领域类发生了改变,删除以前的数据库,然后重建一个新的。采用这种初始化器不用再担心领域类改变影响数据库架构的问题。
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextWY>()); //每次运行程序都会删除以前的数据库,重建新的数据库。如果在开发过程中每次都想使用最新的数据库,那么可以采用这种初始化器。
Database.SetInitializer(new DropCreateDatabaseAlways<WYDB>());
}
public DbSet<Student> Student { get; set; }
public DbSet<Class> Class { get; set; }
}
}

  顺序别反了,反了想知道啥效果自己测试一下。

public ActionResult Index()
{
WYDB db = new WYDB();
var c = db.Class.ToList();
var s = db.Student.ToList();
return View();
}

运行起来看数据库里面

它就生成了对应的数据库,是复数的形式,也可以自己代码配置命名。后面几章会说。

2、Model First

Model First 允许我们使用实体设计器在空模型(扩展名.edmx)中建模型实体及其关系个继承层次结构,然后创建数据库。在Model First 方法中,创建实体模型是必须选择“空模型”,而不是从数据库生成。其优缺点如下:

1)、如果你喜欢可视化应用程序中的数据结构,或者不喜欢编写SQL,那么它将被你喜欢,因为它会自动生成;

2)、在此方法中,我们无法控制实体和数据库,因为自动生成的代码难以修改,所以这种建模方式已经越来越不被开发者使用。但对于小型简单的项目它行之有效;

3)、要在POCO是体重添加额外的功能,我们不得不修改T4模板或者使用部分类来完成;

4)、数据库模型的更改不是最佳选择,是由模板定义了数据库。

         栗子在Models文件夹上 右键-->新建-->新建项-->数据-->ADO.NET实体数据模型,选择空模型,我的命名默认Model1没改然后点击完成

         右击新增加-->实体

然后添加变量

 数据类型自己设置F4,右击表添加关联

然后右击空白根据模型生成数据库就用刚刚的SqlConn链接,在链接字符包含敏感字符选上 后面会生成一个SQL文件 右击执行(Ececute)填连接字符串。连接就可以了

3、Database First

Database First 使我们能够从现有数据库(Sql Server 、Oracle、DB2等)创建模型,此方法减少了自动生成代码所编写的代码量,同时也限制了使用生成代码的结构。优缺点如下:

1)、如果我们已有BDA设计的数据库来单独开发或现有已经存在的数据库,那么它将会作为首选;

2)、通过EDM向导为我们创建实体、关系和继承层次结构,修改映射之后还可以生成POCO实体;

3)、要在POCO实体中添加额外的功能,必须通过T4修改模板或者使用部分类;

4)、数据库的手动更改变为可能,因为数据库定义了领域模型 ,如果要修改数据库表结构,只需要从数据库更新实体模型即可。

        栗子在Models文件夹上 右键-->新建-->新建项-->数据-->ADO.NET实体数据模型,选择来自数据库的ef设计器,我的命名默认。选择表,视图,存储过程的 看自己需要。可以看到生成出来的直接替换了刚刚Model First

Entity Farmework领域建模方式 3种编程方式的更多相关文章

  1. Entity Framework 5.0系列之EF概览-三种编程方式

    概述 在开发面向数据的软件时我们常常为了解决业务问题实体.关系和逻辑构建模型而费尽心机,ORM的产生为我们提供了一种优雅的解决方案.ADO.NET Entity Framework是.NET开发中一种 ...

  2. EF三种编程方式图文详解

    Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下 ...

  3. EF三种编程方式详细图文教程(C#+EF)之Database First

    Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下 ...

  4. EF三种编程方式的区别Database first ,Model first ,code first

    首先对于EF中先出现的datebase  first和model first两种编程方式,其的区别根据字面意思很容易能够理解. datebase  first就是代表数据库优先,那么前提就是先创建数据 ...

  5. python_49_三种编程方式及面向过程与面向函数区别.py

    ''' 三种编程方式:1.面向对象 (类:class)2.面向过程 (过程:def)3.函数式编程(函数:def) 编程语言中函数的定义:函数是逻辑结构化和过程化的一种编程方法 过程与函数的区别,过程 ...

  6. EF三种编程方式详细图文教程(C#+EF)之Code First

    Code First Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的 ...

  7. 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序

    在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...

  8. EF三种编程方式详细图文教程(C#+EF)之Model First

    Model First Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在V ...

  9. [开源]Entity Framework 6 Repository 一种实现方式

    在使用Entity Framework这种ORM框架得时候,一般结合Repository仓储形式来处理业务逻辑:虽然这种模式带来很多好处,但是也会引发一些争议,在此抛开不谈,小弟结合项目经验来实现一下 ...

随机推荐

  1. fclose - 关闭流

    SYNOPSIS 总览 #include <stdio.h> int fclose(FILE *stream); DESCRIPTION 描述 函数 fclose 将名为 stream 的 ...

  2. 多数据源连接Oracle报错,linux熵池耗尽问题

    最近碰到了个很有意思的问题,springboot加载多数据源,遇到了在启动时数据库连接报错的问题. 报错信息: The error occurred while executing a query 然 ...

  3. java在线聊天项目 swt可视化窗口Design 重新设计聊天窗口

    设计的聊天窗口如下: 制作过程: 首先,在默认的BorderLayout视图下, 上边也就是North处添加一个JPanel,将Layout调整为BorderLayout,West放一个JLabel用 ...

  4. 记服务器 httpd 服务无法启动

    httpd 服务无法重启 ,网上查到的资料都是端口号冲突 ,记录一下自己的解决办法 !!! 首先查看 服务状态 :  service status httpd / systemctl status h ...

  5. Linux-nginx服务(三)

    nginx的安装 官方:http://nginx.org/packages/centos/7/x86_64/RPMS Fedora-EPEL:https://mirrors.aliyun.com/ep ...

  6. requests库的学习——跟随官方文档

    发送GET请求: import requests r=requests.get("http://www.kekenet.com/") 如果需要传递参数可以有以下几种方法: impo ...

  7. The North American Invitational Programming Contest 2018 D. Missing Gnomes

    A family of nn gnomes likes to line up for a group picture. Each gnome can be uniquely identified by ...

  8. 【MySQL】可重复读模式下 unique key失效案例

    一 [背景]   今天上午文能提笔安天下,武能上马定乾坤的登博给团队出了一道题目,谁先复现问题,奖励星巴克一杯.激起了一群忙碌的屌丝DBA的极大热情.问题是这样滴,如下图登博提示了几个细节:   1. ...

  9. Android开发——子线程操作UI的几种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制. 转载请标明出处:h ...

  10. OpennSSL之基本了解

    HTTPS是一种协议,等于HTTP+TLS(由于历史原因,SSL3.0之后就被TLS1.0替代了).openssl是一套开源工具集,主要有两个特性: 实现了ssl2,ssl3,TLSv1,TLSv1. ...