EF - Code First 开发方式
概述:
本节介绍通过 Code First 开发建立新数据库。
借助 Code First 可以选择使用类的特性和属性执行配置,或者使用 XML 配置文件来配置,当然也可以使用 Fluent API 执行配置。
Code First 使用场景:对于已经存在了模型类型的项目,怎么使用 EF 呢? Code First,也叫 POCO + Code Only。
Code Only,顾名思义,只需要代码,不需要 Edmx 模型。
EF 提供了通过类型的结构推断生成 SQL 并创建数据库中的表,而且能够通过类型的成员推断出实体间的关系,开发人员只需要编写实体类就可以进行 EF 数据库的开发。
Code First 的优劣势:
优势:
使开发更进一步简洁化。
开发效率又一次提高。
自动化程度进一步提高。
可以适用于原有的老项目。
劣势:
性能不怎么好。
了解的人比较少。
学习成本较高,对开发人员的要求相对较高。
Code First 的两种配置数据库映射的方式
Code First 有两种配置数据库映射的方式,一种是使用数据属性 DataAnnotation,另外一种是使用 Fluent API。
DataAnnotation 的配置方式需要给定义实体和值对象的类和类中的属性加上与数据库映射相关的配置标签。
而 Code First Fluent API 是在 DBContext 中定义数据库配置的一种方式。要使用 Fluent API 就必须在自定义的继承自 DBContext 的类中重载 OnModelCreating 方法。
该方法的签名如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
通过 modelBuilder 这个对象的 Entity<> 泛型方法来配置 DBContent 中每个类的数据库映射。
我们可以通过 Fluent API 配置数据表的名字:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().ToTable("CustomerInfo");
}
这里只简单讲解一下DataAnnotation。
创建 Code First Demo
(1)创建应用程序
选择 “新建 → 项目 → Visual C# → Web → ASP.NET MVC 5 Web 应用程序”,命名为 “MvcFirstCode”,点击 “确认” 按钮后,项目模板选择 “空”,然后再单击 “确认” 按钮。
(2)引入程序集 Entity Framework 和 System.Data.Entity
我们可以使用 NuGet 来进行安装,右击选择 “引用 → 管理 NuGet 程序包”,选择 “EntityFramework” 程序包,单击 “安装” 按钮。
当然,如果觉得以上步骤比较麻烦,也可以使用一种简单的方式来引用:选中项目,右击,选择 “添加 → 新建项”,选择 “数据 → ADO.NET 实体数据模型”,单击 “添加” 按钮,然后选择 “空模型”,点击 “完成” 按钮。(然后删除 Model1.edmx)
(然而方法一只添加了 EF,方法二一个都没添加上)
(3)创建模型
在 Models 文件夹下面创建 Order.cs 和 OrderDetail.cs 模型类文件,Order 代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; namespace MvcFirstCode.Models
{
public class Order
{
/// <summary>
/// 如果属性名后面包括Id,则默认会当成主键,可以不用添加 [Key] 属性
/// </summary>
[Key]
public int OrderId { get; set; } [StringLength()]
public string OrderCode { get; set; } /// <summary>
/// 订单金额
/// </summary>
public decimal OrderAmount { get; set; } /// <summary>
/// 导航属性设置成 virtual,可以实现延迟加载
/// </summary>
public virtual List<OrderDetail> OrderDetail { get; set; }
}
}
OrderDetail 代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace MvcFirstCode.Models
{
public class OrderDetail
{
[Key]
public int OrderDetailId { get; set; } /// <summary>
/// 订单明细单价
/// </summary>
public decimal Price { get; set; } /// <summary>
/// 订单明细数量
/// </summary>
public int Count { get; set; } /// <summary>
/// 外键,如果属性名和Order主键名称一样,默认会当成外键,可以不加ForeignKey特性。(注意 ForeignKey 里面的值要和导航属性的名称一致)
/// </summary>
[ForeignKey("Order")]
public int OrderId { get; set; } /// <summary>
/// 导航属性
/// </summary>
public virtual Order Order { get; set; }
}
}
EF 支持的完整注释列表如下:
Key、StringLength、MaxLength、ConcurrencyCheck、Required、Timestamp、ComplexType、Column、Table、InverseProperty、ForeignKey、DatabaseGenerated、NotMapped。
(4)在配置文件中写连接字符串
在 Web.config 中添加如下配置节点,注意 providerName 属性必填,否则会报错。
<connectionStrings>
<add name="MvcFirstCodeContext" connectionString="Source=.\MSSQLSERVER02;DAATABASE=MvcFirstCode;uid=sa;pwd=1111111" providerName="System.Data.SqlClient"/>
</connectionStrings>
(5)创建上下文类 MvcFirstCodeContext.cs
继承自 DBContext,需要引入命名空间 “using System.Data.Entity;”(引入命名空间的快捷方法是:将鼠标移动到 DBContext 上,然后按 Ctrl + Alt + F10 组合键,再按回车键即可)。
调用父类构造方法,传递连接字符串 “name=xx”,这个 xx 就是刚才配置文件里面配置的连接字符串 name 的名称:
public class MvcFirstCodeContext : DbContext
{
/// <summary>
/// 注意这里的 name 要和配置文件里面配置的上下文连接字符串名称一致
/// </summary>
public MvcFirstCodeContext() : base("name=MvcFirstCodeContext") { }
public DbSet<Order> Order { get; set; }
public DbSet<OrderDetail> OrderDetail { get; set; }
}
(6)根据类型创建数据表
EF - Code First 开发方式的更多相关文章
- EF Code First 初体验
Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model.DataAccess和一 ...
- EF Code First Migrations数据库迁移
1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...
- EF Code First学习系列
EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- EF Code First 主键对应多个外键
这是一位朋友提出的疑问,EF 映射主键可以对应多个外键吗?如果外键设置级联删除会发生什么情况?下面做一个测试,示例实体代码: public class Blog { public Blog() { P ...
- 【记录】EF Code First 实体关联,如何添加、修改实体?
在使用 EF Code First 的时候,我们经常会对项目中的 Entry 进行一对多.多对多的映射配置,这时候就会产生主实体和子实体的概念,我们在添加.修改他们的时候,有时候会产生一些问题,比如添 ...
- EF Code First 一对多、多对多关联,如何加载子集合?
应用场景 先简单描述一下标题的意思:使用 EF Code First 映射配置 Entity 之间的关系,可能是一对多关系,也可能是多对多关系,那如何加载 Entity 下关联的 ICollectio ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
前言 从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...
随机推荐
- mondodb和mysql的区别
我想从安全性和数据量这两个方面进行阐述. mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成, MongoDB ...
- json转换导致金额失真问题解决
平台的余额查询逻辑中,今天爆了个雷.因平台用户都是较大的商户,且资金一般都是整数(这也是埋雷这么久的原因吧),但今天有客户说他们今天充值金额有个0.63的零头,但为何页面展示的账户余额零头却只是0.6 ...
- WebForm文件上传
用 FileUpload控件进行上传文件. <asp:FileUpload ID="FileUpload1" runat="server" /> ...
- 解决SVN提交和更新代码冲突?
解决冲突有三种选择: 1.放弃自己的更新,使用svn revert(回滚),然后提交.在这种方式下不需要使用svn resolved(解决) 2.放弃自己的更新,使用别人的更新.使用最新获取的版本覆盖 ...
- php读取文件使用redis的pipeline(管道)导入大批量数据
需求:需要做一个后台上传TXT文件,读取其中的内容,然后导入redis库中.要求速度快,并且支持至少10W以上的数据,而内容也就一个字段存类似openid和QQ 传统做法:我一开始做的时候就老套路,遍 ...
- JAVA锁有哪些种类,以及区别(转)
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级 ...
- linux 命令中英文对照,收集
linux 命令中英文对照,收集 linux 命令英文全文 Is Linux CLI case-sensitive? The answer is, yes. If you try to run L ...
- JZ2440学习笔记之内存设备
通过OM[1:0]选择启动的设备: OM[1:0]=00,地址0对应的是Internal 4K RAM,且Nand的前4K会被复制到这里,得到执行: OM[1:0]=01,地址0对应的是Nor Fla ...
- php,js 对字符串按位异或运算加密解密
异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...
- ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据
检索出的数据列表按字段匹配的优先顺序 一.举例 比如,发布一篇文章,文章包括基本的字段包括标题.发布时间.点击率.关键字.内容.当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据 ...