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仓储形式来处理业务逻辑:虽然这种模式带来很多好处,但是也会引发一些争议,在此抛开不谈,小弟结合项目经验来实现一下 ...
随机推荐
- C06 变量和存储类型
目录 全局变量 局部变量 存储类型 全局变量和局部变量 变量的作用域 作用域:某些事物起作用或有效的区域. 变量的使用范围称为变量的作用域. 变量的作用域决定了变量的可操作性和有效性. C语言变量的作 ...
- java在线聊天项目0.4版本 制作服务端接收连接,客户端连接功能 新增客户端窗口打开时光标指向下边文本域功能,使用WindowListener监听WindowAdapter
建一个服务端类ChatServer,用于设置端口接收连接 package com.swift; import java.io.IOException; import java.net.ServerSo ...
- React初识整理(五)--Redux和Flux(解决状态传递问题)
Flux 1.引入:在React的应⽤中,状态管理是⼀个⾮常重要的⼯作.我们不会直接对DOM节点进⾏操作,⽽是通过将数据设置给state,由state来同步UI,这种⽅式有个潜在的问题,每个组件都有独 ...
- 分享一个C++与Python开发的中小型通用游戏服务端框架(跨平台,开源,适合MMORPG游戏)
在开发一款游戏项目时,在立项时我们往往会考虑或者纠结很多,比如: 1,对于开发来说:服务端和客户端应该选择什么语言?用什么协议通信才更效率?协议后期如何维护?Socket是用长连接还是短连接?TCP还 ...
- mysql的字符串处理函数用法
1.LOCATE函数 LOCATE(substr,str) 返回子串 substr 在字符串 str 中第一次出现的位置.如果子串 substr 在 str 中不存在,返回值为 0.如果substr或 ...
- (11)zabbix item types监控类型
1. 什么是item types item types是由zabbix提供的各种类型的检查器(这样翻译很奇怪),大致就是Zabbix agent, Simple checks, SNMP, Zabbi ...
- shell 管道导致的变量重置问题
测试脚本: #!/bin/sh flag= func() { flag= } main() { func | echo "flag=$flag" } 输出显示的flag=0! 参考 ...
- 命令行发送UDP
https://www.cnblogs.com/Dennis-mi/articles/6866762.html: 如果往本地UDP端口發送數據,那麼可以使用以下命令:echo “hello” > ...
- 创建yum仓库
第1章 服务端)创建yum仓库目录 命令:(创建)mkdir -p /application/yum/centos6.6/x86_64/ 命令:(切换)cd /application/yum/cent ...
- idea 插件推荐 & 代码样式安装
部分链接打不开的可能需要梯子, 部分插件我懒得截图了,麻烦 ---------------------------------------header------------------------- ...