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仓储形式来处理业务逻辑:虽然这种模式带来很多好处,但是也会引发一些争议,在此抛开不谈,小弟结合项目经验来实现一下 ...
随机推荐
- 关于js作用域问题详解
执行上下文 函数表达式和函数声明 1. console.log(a); // ReferenceError: a is not defined // ReferenceError(引用错误)对象表明一 ...
- 前台解析json的方法
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- tp5 -- 微信公众号支付
近来期间比较忙, 忙完之后发现最近有挺多的东西没有整理,于是乎.就将以前用到的一些小东西整理了一下. 如果对您有帮助,则是我最大的幸运. 本篇主要是说了一下整合TP5的微信公众号支付. 不过由于最近T ...
- shelll脚本,根据软链接,找到真实路径
[root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...
- Redis string类型常用操作
Redis 有 string.list.set.zset.hash数据类型.string类型是最基础的,其他类型都是在string类型上去建立的,所以了解熟悉string类型的常用操作对于学习re ...
- UNIX环境C语言进程通信
一.信号管理 1.函数signal signal函数是UNIX系统信号机制最简单的接口 #include <signal.h> typedef void (*sighandler_t)(i ...
- C++ STL容器底层机制
1.vector容器 vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入 ...
- windows10系统下安装keras框架以theano为后端并配置gpu加速
在安装之前,请确保你的显卡是NVIDIA的,并且是以下型号,否则不能进行gpu加速,右键我的电脑--管理--设备管理器--显示适配器.另外如果你的电脑是windows7,安装教程也是一样的,不过根据k ...
- django的rest framework框架——版本、解析器、序列化
一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...
- django的rest framework框架——认证、权限、节流控制
一.登录认证示例 模拟用户登录,获取token,当用户访问订单或用户中心时,判断用户携带正确的token,则允许查看订单和用户信息,否则抛出异常: from django.conf.urls impo ...