EF Code First 初体验
Code First 顾名思义就是先代码,再由代码生成数据库的开发方式。
废话不多说,直接来一发看看:
在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model、DataAccess和一个控制台项目BreakAwayConsole。分别是实体、数据访问、控制台显示。
项目结构图:

详细介绍:
1.实体类Model
本类库下有两个类:Lodging(住宿类)、Destination(景点类)
Lodging类定义:
/// <summary>
/// 住宿类
/// </summary>
public class Lodging
{
public int LodgingId { get; set; }
public string Name { get; set; }
public string Owner { get; set; }
public bool IsResort { get; set; } //是否度假胜地 public Destination Destination { get; set; }
}
跟以往实体类的定义多了一个导航属性Destination。它是EF中指定主外键关系用的,后续演示Fluent API和Data Annotation配置实体关系会大面积用到。
下面是Destination类定义:
/// <summary>
/// 景点类
/// </summary>
public class Destination
{
public int DestinationId { get; set; }
public string Name { get; set; }
public string Country { get; set; }
public string Description { get; set; }
public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; }
}
同样有个导航属性,跟上面的不同,这是一个List集合类型的。通俗点理解:Destination包括很多(List)个Lodging,就是一个景点(Destination)有很多住宿(Lodging)的地方,所以Destination类里是:List<Lodging> Lodgings;而一个住宿(Lodging)的地方只能在一个景点(Destination),所以住宿类Lodging里的导航属性就是Destination的,而不是List<Destination>。
2.数据访问DataAccess
本类库需要引用EntityFramework,同时需要添加引用并在类中using System.Data.Entity,还需要添加对Model类的引用
EF访问数据库是通过数据库上下文对数据库进行CRUD(增查改删)的,所以我们新建一个继承DbContext的数据库访问类BreakAwayContext:
public class BreakAwayContext : DbContext
{
//以下是数据库上下文对象,以后对数据库的访问就用下面对象
public DbSet<CodeFirst.Model.Destination> Destinations { get; set; }
public DbSet<CodeFirst.Model.Lodging> Lodgings { get; set; }
}
本类就是数据库上下文访问类,以后每添加一个实体,都需要添加进来。
3.控制台BreakAwayConsole
此层需要设置为启动项目(右键 - 设为启动项目)
Program类需要添加如下引用:Model、DataAccess类库和EntityFramework
然后为Program.cs添加一个方法:
private static void InsertDestination()
{
var destination = new CodeFirst.Model.Destination
{
Country = "Indonesia",
Description = "EcoTourism at its best in exquisite Bali",
Name = "Bali"
};
using (var context = new CodeFirst.DataAccess.BreakAwayContext())
{
context.Destinations.Add(destination);
context.SaveChanges();
}
}
简单的linq写法,向数据库的Destination表里插入一条数据。然后在Main方法里调用InsertDestination方法。
后期我们肯定要不停的修改Model里的实体类,所以在Main方法里加上一句:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CodeFirst.DataAccess.BreakAwayContext>());
意思就是:如果实体类有变化就重新生成一下数据库(DropCreateDatabaseIfModelChanges)。使用这个方法又得添加引用:using System.Data.Entity;
一切就绪后,我们F5运行下控制台项目,看能不能根据实体类代码生成对应的数据库并通过上下文对象向数据库中插入一条数据
静静等待几秒钟,报了一个ProviderIncompatibleException的错,如图:

意思就是找不到数据库。EF4.1默认的数据库是:.\SQLEXPRESS,如果本地没有SQLEXPRESS,EF会尝试LocalDb\v11.0(包含在VS2012中)
演示demo配套使用的数据库是sql 2008企业版,所以必须在配置文件里指定数据库,为控制台项目添加一个配置文件App.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.;Database=BreakAwayConfigFile;Trusted_Connection=True"/>
<add name="My_Test" providerName="System.Data.SqlClient" connectionString="Server=.;Database=MyBreakAwayDb;Trusted_Connection=true" />
</connectionStrings>
</configuration>
我们写了两个节点,name值分别为BreakAwayContext和My_Test,BreakAwayContext和数据库上下文类名称完全一样,我们转到BreakAwayContet类并添加构造函数,让上下文能找到数据库:
public BreakAwayContext(): base("name=BreakAwayContext")
{ }
注意:name=BreakAwayContext可以不写,因为默认就是找配置文件里name和本类名称一致的数据库连接串,即BreakAwayContext,那么生成的数据库就是配置文件里对应节点指定的:BreakAwayConfigFile。如果要指定找特定数据库连接字符串,那直接修改name=My_Test即可,这样就找配置文件里第二个数据库连接字符串了,生成的数据库自然就是:MyBreakAwayDb。简单明了。
当然EF中还有其他找数据库连接字符串的方法,比如:DbConnection、连接工厂等,具体请自行学习,这里只介绍最常用的。
此时,我们再运行下程序就能正确的生成数据库了:

注意观察会发现:多生成了一张EdmMetadata表,这是监控实体类变化的表,后续文章会有介绍。
同时,EF为每张表都生成了主键,同时也设置了对应的外键关系。(主键是EF的默认的映射规则,外键是因为我们给实体类加上了导航属性)。其他所有字段都是默认的可空类型,大小也是默认的max。当然,项目中肯定不会让每个字段都是可空的,后续文章会演示如何配置这些字段。
ok,本文到此结束,Demo随下篇文章一起放出。下篇文章讲EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射。
3ks 4 reading
EF Code First 初体验的更多相关文章
- FE—— Code First 初体验 01(转)
EF Code First 初体验 Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项 ...
- VS Code python初体验笔记
之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Pyth ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
- EF Code First、DbContext
EF Code First.DbContext 对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念一下泉涌而出,犹如当头一棒,的确有点不知所 ...
- 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...
- C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名
转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- Microsoft IoT Starter Kit 开发初体验
1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费开放1000套的申请.申请地址为:http:// ...
随机推荐
- 读书笔记--SQL必知必会19--存储过程
不同的DBMS对存储过程的实现不同,差异巨大,这里不涉及具体的DBMS,仅仅说明存储过程的简单含义. 19.1 存储过程 简单来说,存储过程就是为以后使用而保存的一条或多条SQL语句. 可以将存储过程 ...
- PHP环境配置
PHP环境配置 1.Apache的安装 第一步: 1. 双击httpd-2.2.17-win32-x86-no_ssl.msi.出现 Windows 标准的软件安装欢迎界面,直接点“Next”继 ...
- CSS常见居中讨论
先来一个常见的案例,把一张图片和下方文字进行居中: 首先处理左右居中,考虑到img是一个行内元素,下方的文字内容也是行内元素,因此直接用text-align即可: <style> .con ...
- 不到一百行实现一个小siri
想要容易理解核心的特征计算的话建议先去看看我之前的听歌识曲的文章,传送门:http://www.cnblogs.com/chuxiuhong/p/6063602.html 本文主要是实现了一个简单的命 ...
- shell脚本规划化模板
shell脚本规划化模板 Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的.脚本必须规范化,应该从以后几个 ...
- C#对.zip 存档读取和写入
Framework4.5支持 引用: System.IO.Compression.dll,System.IO.Compression.FileSystem.dll 提取压缩文件 ZipFile.Ext ...
- [Tool] Open Live Writer 插件更新
最新插件下载地址:Memento.OLW_V1.0.0.2.7z 零.历史更新记录 2016.11.24 1. 修正 cnblog 语法高亮中的 SQL.Perl 语法高亮异常 下载地址:Mement ...
- GridView详细介绍
GridView控件的属性 表10.6 GridView控件的行为属性属性描述AllowPaging指示该控件是否支持分页.AllowSorting指示该控件是否支持排序.AutoGenerateCo ...
- ASP.net MVC 文件下载的几种方法(欢迎讨论)
在ASP.net MVC 中有几种下载文件的方法 前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的. 第一种:最简单的超链接方法,&l ...
- ASP.NET用QQ,网易发送邮件以及添加附件
教程:ASP.NET用QQ,网易发送邮件以及添加附件 这是我用QQ邮箱出现的异常: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !无法从传输连接中读 ...