Entity Farmework领域建模方式 3种编程方式
一个业务领域由各个实体和各个相互关联且有格子的属性和行为的实体组成,每个实体都有其状态和验证规则需要维护,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种编程方式的更多相关文章
- Entity Framework 5.0系列之EF概览-三种编程方式
概述 在开发面向数据的软件时我们常常为了解决业务问题实体.关系和逻辑构建模型而费尽心机,ORM的产生为我们提供了一种优雅的解决方案.ADO.NET Entity Framework是.NET开发中一种 ...
- EF三种编程方式图文详解
Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下 ...
- EF三种编程方式详细图文教程(C#+EF)之Database First
Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下 ...
- EF三种编程方式的区别Database first ,Model first ,code first
首先对于EF中先出现的datebase first和model first两种编程方式,其的区别根据字面意思很容易能够理解. datebase first就是代表数据库优先,那么前提就是先创建数据 ...
- python_49_三种编程方式及面向过程与面向函数区别.py
''' 三种编程方式:1.面向对象 (类:class)2.面向过程 (过程:def)3.函数式编程(函数:def) 编程语言中函数的定义:函数是逻辑结构化和过程化的一种编程方法 过程与函数的区别,过程 ...
- EF三种编程方式详细图文教程(C#+EF)之Code First
Code First Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的 ...
- 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- EF三种编程方式详细图文教程(C#+EF)之Model First
Model First Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在V ...
- [开源]Entity Framework 6 Repository 一种实现方式
在使用Entity Framework这种ORM框架得时候,一般结合Repository仓储形式来处理业务逻辑:虽然这种模式带来很多好处,但是也会引发一些争议,在此抛开不谈,小弟结合项目经验来实现一下 ...
随机推荐
- objdump命令
0x00 objdump命令是Linux下的反汇编目标文件或者可执行文件的命令 0x01 objdump -f 显示test的文件头信息 $ objdump -f levellevel: file ...
- tp5对接支付宝支付简单集成
对于每个刚开始工作的新手来说,无论支付宝支付还是微信支付都是跑不掉的一个小门槛. 在加上本人比较技术比较渣(比较懒导致的),不太喜欢引用那么大的SDK,于是就简单集成了一下支付宝的支付. 但也只是只有 ...
- HTML5<picture>元素
HTML5<picture>元素可以设置多张图片 <!DOCTYPE html><html><head><meta http-equiv=&quo ...
- baidumap demo(一)
覆盖物概述 地图上自定义的标注点和覆盖物我们统称为地图覆盖物.您可以通过定制BMKAnnotation和BMKOverlay来添加对应的标注点和覆盖物.地图覆盖物的设计遵循数据与View分离的原则,B ...
- Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器
Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器 字数244 阅读197 评论0 喜欢0 把ISO镜像转换为一个可启动的USB设备.一种可行的方法是通过OS X的Terminal “浇灌”到 ...
- js函数式编程(三)-compose和pointFree
compose即函数嵌套组合 组合compose在第一篇已经初见端倪,可以感受一下.compose函数的实现用闭包的方法.不完善实现如下: const compose = (f, g) => { ...
- Python学习记录1
交互式解释器 模块 python序列 索引提取 序列运算 空列表 成员资格 长度最大值最小值函数 列表 list和join函数 交互式解释器 ' >>> '为提示符. 语句是用来告诉 ...
- Ubuntu美化
Ubuntu美化 觉得ubuntu18.04的界面太丑了,所以决定美化一下. 整了好长时间特别费事.所以写个随笔记录一下. 安装gnome-tweak-tool和gnome-shell-extensi ...
- python常用内置函数用法精要
用一个表格大致总结一下所有的内置函数用法,如下: 函数 功能简要说明 abs(x) 返回数字x的绝对值或复数x的模 all(iterable) 如果对于可迭代对象中所有元素x都等价于True,则返回T ...
- linux centeros 通过 innoback 工具备份mysql 5.7 全库并自动压缩zip上传到备份服务器的脚本,附自动清理过期备份
innoback 安装见连接:https://blog.csdn.net/fanren224/article/details/79693863 脚本解析后续将更新 181024:更新添加定期清理备份的 ...