写在前面

  1. 新建项目
  2. 安装EntityFramework程序包
  3. 创建模型
  4. 创建上下文DbContext
  5. 创建数据库、读/写数据
  6. 配置连接字符串
  7. Code First 迁移
  8. 示例Demo下载
  9. 后记

  以前逛园子的时候,很多大牛写的一些东西,什么AOP、DDD之类的,看过之后一头雾水,远望大牛,回过头看看自己,原来程序员的差距还可以这么大。每个程序员都有个大牛梦想,当然小菜我也是,只是还在开始的路上。

  因为前几天研究easyui,准备写个mvc+ef+easyui的简单示例,当然这对很多人来说很简单,有段时间也研究过别人写的,但这是小菜我第一次自己写,勿喷。而且这周安排给自己的任务:设计模式第五篇-控制反转(ioc),前段时间做些其他方面的事,设计模式也好久没写了,所以这周必须把它完成,想研究完ioc之后,试着再写上面的简单示例,把ioc融入到mvc中,想想应该有搞头。

  关于Code First,昨晚无意间看到一位园友翻译的相关教程:http://www.cnblogs.com/qouoww/archive/2011/12/31/2309066.html,这边小弟先谢过,前面几篇还可以看下去,但是后面几篇就有点不知所云了,学习是一方面,实践是另一方面,做的过程中才能学到更多的东西,这边也试着写个关于Code First的小示例。

  自己动手,丰衣足食。

新建项目

  我使用的是vs2012,如果使用vs2010需要安装NuGet。

Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。

  新建-项目-Visual C#-windows-控制台应用程序,命名为:CodeFirstDemo。

  这边需要注意的是:选择.net framework的时候要4.0以上版本,要不然下面NuGet安装EntityFramework扩展的时候会报创建项目版本底无法完成安装的错误,.net framework改成4.0就可以了,但是换了一台电脑3.5版本测试安装又是好的,不知是个什么情况,反正.net framework版本最好选择4.0以上。

安装EntityFramework程序包

  新建好CodeFirstDemo项目后,我们先来安装EntityFramework,项目-管理NuGet程序包-联机-搜索“EntityFramework”,下载安装。

  安装完成后会在项目下自动添加EntityFramework引用:

  在Program.cs代码文件中添加下面命名空间:

 using System.Data.Entity;

创建模型

  Code First顾名思义就是代码先行的意思,除了Code First,还有Model First、DatabaseFirst,关于他们几个的区别:http://blog.bossma.cn/csharp/when-is-code-first-not-code-first/

  下面我们在Program.cs中创建几个模型,平常我们可以分离出来。

     public class New
{
public int NewId { get; set; }
public string Title { get; set; } public int NewTypeId { get; set; }
public virtual NewType NewType { get; set; }
} public class NewType
{
public int NewTypeId { get; set; }
public string Name { get; set; } public int BlogId { get; set; }
public virtual List<New> New { get; set; }
}

  NewId和NewTypeId在创建的时候会做为表的主键,因为包含有ID关键字,如果不包含的话,需要我们指定主键,要不然创建就会报未找到主键的错误,添加命名空间:

 using System.ComponentModel.DataAnnotations;

  并在属性前添加[Key]标注,指示此字段作为主键,例如:

         [Key]
public string UserName { get; set; }

  当然除了Key,System.ComponentModel.DataAnnotations命名空间下还有其他的Attribute,这边就不多说,可以查看msdn有关教程:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx

  需要注意的另外一点,上面定义模型属性的时候有virtual关键字,表示延迟加载,我的理解是这样:当我访问主实体的时候,启动延迟加载,而不会查询数据库的子实体,只有要访问它的时候才会去数据库查询加载,泛型List表示此实体是一对多的关系。

  EF默认是启动延迟加载的,我们如果不需要也可以手动禁止:

 db.Configuration.LazyLoadingEnabled = false;,

创建上下文DbContext

  我对EF中上下文的理解:可以把上下文看成一个数据库控制器,我们可以在其中查询、更改、删除数据,然后通过连接获取或是提交。就像是遥控车的遥控器一样,EF是这个遥控器的核心部件,天线是连接字符串,遥控车是数据库,这个比喻可能不是很恰当,但就是这个意思,大家都懂得。

     public class NewsContext : DbContext
{
public DbSet<New> News { get; set; }
public DbSet<NewType> NewTypes { get; set; }
}

  DbSet表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合,就像是一个包裹,需要什么东西就往里面装什么东西。

创建数据库、读/写数据

  在Program.cs的Main方法中填写代码:

             using (var db = new NewsContext())
{
Console.Write("输入新闻类型标题: ");
var name = Console.ReadLine(); var type_Model = new NewType { Name = name };
db.NewTypes.Add(type_Model);
db.SaveChanges(); Console.WriteLine("查询新闻类型标题:");
var search_type = Console.ReadLine();
var query = from b in db.NewTypes
where b.Name == search_type
select b; Console.WriteLine("查询结果:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
} Console.ReadKey();
}

  上面代码创建一个上下文对象实例,通过该实例添加一个新闻实体,然后通过输入的值,linq查询结果输出。

  通过上面的操作,我们并没有创建什么连接字符串和数据库操作,但是打开数据库就可以看到我们通过Code First创建的数据库了。

  我当时做的时候,运行代码没有错误,但是用.\SQLEXPRESS和localhost登陆都看不到数据库,安装vs2012就给自动安装了localdb,因为我本地没 .\SQLEXPRESS,MSDN相关注解:

  • 如果本地 SQL Express 实例可用(默认情况下随 Visual Studio 2010 安装),则 Code First 已对该实例创建了数据库
  • 如果 SQL Express 不可用,则 Code First 将尝试使用 LocalDb(默认情况下随 Visual Studio 2012 安装)

配置连接字符串

  通过上面默认生成数据库规则可以看出,数据库名是项目命名空间+上下文,有时候我们需要自己定义生成数据库名称,或是生成数据库到指定的服务器,而且有时候数据库迁移了,我们不能再重新生成一遍吧,这时候我们就要自定义数据库连接字符串了:

   <connectionStrings>
<add name="NewContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=CodeFirstDemoDB;Trusted_Connection=true" />
</connectionStrings>

  需要注意的是:连接字符串的名称必须要和上下文一致,而且connectionStrings必须放在configuration节点内的最下面,如果放在最上面会报下面这种错误:

  我们重新按照上面的操作运行程序,就可以在指定的服务器.\SQLEXPRESS,生成指定的数据库CodeFirstDemoDB。

Code First 迁移

  关于Code First 迁移其实就是我们在更改模型的时候,数据库要相应的更改,打开工具-库程序包管理器-程序包管理器控制台。

  1,例如我们上面创建NewTypes表的时候,没有指定字段的长度,默认是创建字段类型是nvarchar(MAX),有时候我们觉得字段长度太长,需要修改一下字段长度,不要直接去修改数据库,而是在模型中修改:

         [MaxLength()]
public string Name { get; set; }

  MaxLength就是上面我们说到DataAnnotations命名空间下的类型,这边我们注意下,我们在生成数据库的时候添加了一条数据,Name字段值是“newtype one”,看看我们修改字段长度后,字段值是否发生变化?

  2,在程序包管理器控制台输入“Enable-Migrations”命令来启用迁移,运行完成后在项目中会创建一个Migrations文件夹,下来有两类文件:

  • Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
  • <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序。

  需要注意的是:在我们生成数据库的时候,除了New和NewType表外,还有一个系统生成表__MigrationHistory,从表名上就可以看出是迁移历史记录表。

  3,在程序包管理器控制台输入“Add-Migration Update-NewType-Name”命令,Add-Migration表示增加一个迁移,后面是迁移名称,这个我们可以随便写,运行后会自动检测模型和数据库发生的变化,在Migrations文件夹下会生成一个“201403290930423_Update-NewType-Name.cs”文件,打开我们可以看到更新内容:

     public partial class UpdateNewTypeName : DbMigration
{
public override void Up()
{
AlterColumn("dbo.NewTypes", "Name", c => c.String(maxLength: ));
} public override void Down()
{
AlterColumn("dbo.NewTypes", "Name", c => c.String());
}
}

  从上面可以看出就是我们上面修改模型的内容,当然你也可以在这上面直接修改,比如你再加一个更新,可以一起提交到数据库。

  4,在程序包管理器控制台输入“Update-Database”命令,表示将所有的迁移应用到数据库,打开数据库,我们看一下效果:

  从上面可以看出,字段Name的类型已经修改为nvarchar(50),而且字段值并没有发生变化,可以证明,Code First迁移并不是删除数据库再创建。

  Code First迁移除了上面说的字段类型修改还有很多内容,比如添加字段,删除字段,删除表等等,但都是大同小异,可以举一反三。

示例Demo下载

  下载地址:http://pan.baidu.com/s/1i3DS9b3

后记

  凡事贵在开始,更贵在坚持,与你共勉。。。

  如果你觉得本篇文章对你有所帮助,请点击右下部“推荐”,^_^

初试Code First(附Demo)的更多相关文章

  1. 初试JqueryEasyUI(附Demo)

    写在前面 准备 布局Layout 菜单树Tree 内容页Tabs 右键菜单Menu 表单Form 对话框Dialog 示例Demo下载 关于easyui不多说,对于我们这样没有美术功底的程序员来说,简 ...

  2. 基于socket的客户端和服务端聊天简单使用 附Demo

    功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...

  3. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  4. Asp.net MVC集成Google Calendar API(附Demo源码)

    Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...

  5. winserver的consul部署实践与.net core客户端使用(附demo源码)

    winserver的consul部署实践与.net core客户端使用(附demo源码)   前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...

  6. C#开发微信公众平台-就这么简单(附Demo)转载

    C#开发微信公众平台-就这么简单(附Demo)  来源:https://www.cnblogs.com/xishuai/p/3625859.html#!comments 写在前面 阅读目录: 服务号和 ...

  7. Android 浮动窗口进阶——画中画,浮动视频(附Demo)

    今天继续上一篇Android顶层窗口.浮动窗口的进阶应用.上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口.今天主要是讲讲如何在顶层窗口里面播放视频, ...

  8. FMDB的使用方法(附Demo)

    http://www.jianshu.com/p/54e74ce87404 最近在项目中需要在多个页面对同样的数据进行相关操作,于是便用到了FMDB数据库操作,以下便是FMDB的一些简单的使用方法.附 ...

  9. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  10. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

随机推荐

  1. Torch7学习笔记(四)StochasticGradient

    使用随机梯度下降训练神经网络 StochasticGradient是一个比较高层次的类,它接受两个参数,module和criterion,前者是模型结构,后者是损失函数的类型.这个类本身有一些参数: ...

  2. Python之路【第六篇】python基础 之面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象  和  issubclass(su ...

  3. placehoder不兼容ie9以下和opero12以下

    颜色设置 解决方案一: ::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } :-moz-placeholder { /* ...

  4. CF2.E

    E. Comments time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  5. vim的配置与使用

    经历了一次source insight 一言不合就崩溃之后,决定还是花点时间好好配置和学习以下vim 于是找到大神的配置 https://github.com/humiaozuzu/dot-vimrc ...

  6. 使用JavaScript获取日期加随机数生成单号

    今天学习Javascript,得到一个自动生成单号的JavaScript,留下日后备用: function getNowFormatDate() { var day = new Date(); var ...

  7. 浅谈C#中常见的委托<Func,Action,Predicate>(转)

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

  8. ENode框架Conference案例分析系列之 - 架构设计

    Conference架构概述 先贴一下Conference案例的在线地址,UI因为完全拿了微软的实现,所以都是英文的,以后我有空再改为中文的. Conference后台会议管理:http://www. ...

  9. 在Github上搭建自己的博客(Windows平台)

    折腾了好久,终于在Github上搭建了自己的博客.这里面总结一下过程希望对大家能有所帮助. Github建博优缺点 和 csdn,新浪,网易相比,在Github上可以自己实现功能 和阿里云,VPS相比 ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (33) ------ 第六章 继承与建模高级应用之TPH与TPT (2)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-8  嵌套的TPH建模 问题 你想使用超过一层的TPH继承映射为一张表建模. 解 ...