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。当然,项目中肯定不会让每个字段都是可空的,后续文章会演示如何配置这些字段。

FE—— Code First 初体验 01(转)的更多相关文章

  1. EF Code First 初体验

    Code First 顾名思义就是先代码,再由代码生成数据库的开发方式. 废话不多说,直接来一发看看:在VS2010里新建一个空白解决方案,再依次添加两个类库项目:Model.DataAccess和一 ...

  2. VS Code python初体验笔记

    之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Pyth ...

  3. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  4. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  5. Node.js 网页瘸腿爬虫初体验

    延续上一篇,想把自己博客的文档标题利用Node.js的request全提取出来,于是有了下面的初哥爬虫,水平有限,这只爬虫目前还有点瘸腿,请看官你指正了. // 内置http模块,提供了http服务器 ...

  6. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  7. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  8. Microsoft IoT Starter Kit 开发初体验

    1. 引子 今年6月底,在上海举办的中国国际物联网大会上,微软中国面向中国物联网社区推出了Microsoft IoT Starter Kit ,并且免费开放1000套的申请.申请地址为:http:// ...

  9. python--爬虫入门(七)urllib库初体验以及中文编码问题的探讨

    python系列均基于python3.4环境 ---------@_@? --------------------------------------------------------------- ...

随机推荐

  1. 2016年VR&AR有市场吗?

    新霸哥发现了近期虚拟现实(VR)和增强现实(AR)非常火,已经成为了科技产业中最具前景的技术之一.其实说起这两项技术的应用,人们最容易把它与电子游戏联系在一起,那么在2016年VR&AR有市场 ...

  2. Tkinter教程之Canvas篇(3)

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811922 ''Tkinter教程之Canvas篇(3)''''''16.移动item'''# ...

  3. Iaas概述

    IAAS :设施即服务,为开发者提供存储,计算,网络等资源,整体架构如下图: 整体分为三个部分: 1.Iaas云的管理部分:对整个云有超级用户管理权限,可以查看监控整个云中的资源,租户信息,并进行管理 ...

  4. JAVA NIO 类库的异步通信框架netty和mina

    Netty 和 Mina 我究竟该选择哪个? 根据我的经验,无论选择哪个,都是个正确的选择.两者各有千秋,Netty 在内存管理方面更胜一筹,综合性能也更优.但是,API 变更的管理和兼容性做的不是太 ...

  5. 第二百七十二、三天 how can I 坚持

    昨天加班回来都很晚了,也忘了些日志了.其实感觉加班也没什么啊,一个团队在一块说说闹闹,愉快的完成工作挺好. 今天是2015年的最后一天,2015的愿望啊,只怪自己太怂了.不怂会是什么结果. 其实更应该 ...

  6. 第二百六十四天 how can I 坚持

    现在上班闲的有点蛋疼,感觉没什么事,学不到什么东西. 到底要不要买房啊.也想买啊.愁人. 这辈子绝不会就这样. 睡觉.

  7. 从输入 URL 到页面加载完成的过程中都发生了什么事情?

    这个问题是老生常谈的问题啦,虽然说到处百度都有的答案,还是希望自己能总结一下. 如今有很多答案,都是从硬件开始讲起,比如键盘的响应或者触屏的响应,然后CPU处理到OS的内核等等.这里不作为重点来讲,要 ...

  8. SpringMVC学习笔记

    1.严格实现MVC设计思想的框架,严格分层,减少耦合: 2.组件(红色必需) 2.1 DispatcherServlet 前端控制器 2.2 Controller 业务控制器 2.3 Handler ...

  9. 现在,UICollectionViews有了简单的重排功能

    原文:UICollectionViews Now Have Easy Reordering 我是UICollectionView的忠实粉丝.这个类比起它的老哥UITableView类具有更高的可定制性 ...

  10. Spring Auto-Wiring Beans

    In Spring framework, you can wire beans automatically with auto-wiring feature. To enable it, just d ...