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. Polymer——Web Components的未来

    什么是polymer? polymer由谷歌的Palm webOS团队打造,并在2013 Google I/O大会上推出,旨在实现Web Components,用最少的代码,解除框架间的限制的UI 框 ...

  2. Python 核心数据类型

    1.Python中一切皆对象 2.Python中不需要申明对象类型,对象的类型由运行的表达式决定 3.创建了对象意味着绑定了对象的操作到此对象,也就是在固有的对象上只能调用该对象特有的操作.比如只能将 ...

  3. trie树 Codeforces Round #367 D Vasiliy's Multiset

    // trie树 Codeforces Round #367 D Vasiliy's Multiset // 题意:给一个集合,初始有0,+表示添加元素,-去除元素,?询问集合里面与x异或最大的值 / ...

  4. 在Ubuntu6.06 在搭建SVN服务器及在windows建立svn+ssh客户端 (续)

    接上篇.本篇主要介绍windows下建立svn+ssh客户端. 9.在windows下安装svn客户端,则需安装“TortoiseSVN”.“Puttygen”和“Pageant”    9.1.下载 ...

  5. 一起刷LeetCode3-Longest Substring With Repeating Characters

    拖延症太严重了TAT,真心要处理一下这个问题了,感觉很不好! --------------------------------------------------------------------- ...

  6. CSS定位(CSS定位概述、相对定位、绝对定位、浮动)

    CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...

  7. sql-case列转行

    1:对列进行逻辑判断 select ID,Score, case when Score>=90 then 'A' when Score>=80 then 'B' when Score> ...

  8. 个人思考:能否sub.prototye=sup.prototype实现继承

    var Sup=function(name){ this.name=name; }; var Sub=function(name){ this.name=name; }; Sup.prototype. ...

  9. MySQL锁问题最佳实践

    最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会造成严重的影响,没有处理经验的用户往往无从下手.下面将从整个数据库设计,开发,运维阶段介绍如何 ...

  10. 【转】Maven实战(七)---传递依赖

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47000069   感谢! 假设A-->C  B-->A      ...