初试Code First(附Demo)
写在前面
以前逛园子的时候,很多大牛写的一些东西,什么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)的更多相关文章
- 初试JqueryEasyUI(附Demo)
写在前面 准备 布局Layout 菜单树Tree 内容页Tabs 右键菜单Menu 表单Form 对话框Dialog 示例Demo下载 关于easyui不多说,对于我们这样没有美术功底的程序员来说,简 ...
- 基于socket的客户端和服务端聊天简单使用 附Demo
功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- Asp.net MVC集成Google Calendar API(附Demo源码)
Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...
- winserver的consul部署实践与.net core客户端使用(附demo源码)
winserver的consul部署实践与.net core客户端使用(附demo源码) 前言 随着微服务兴起,服务的管理显得极其重要.都知道微服务就是”拆“,把臃肿的单块应用,拆分成多个轻量级的 ...
- C#开发微信公众平台-就这么简单(附Demo)转载
C#开发微信公众平台-就这么简单(附Demo) 来源:https://www.cnblogs.com/xishuai/p/3625859.html#!comments 写在前面 阅读目录: 服务号和 ...
- Android 浮动窗口进阶——画中画,浮动视频(附Demo)
今天继续上一篇Android顶层窗口.浮动窗口的进阶应用.上一篇主要讲解了WindowManager服务和如何使用WindowManager编写一个顶层窗口.今天主要是讲讲如何在顶层窗口里面播放视频, ...
- FMDB的使用方法(附Demo)
http://www.jianshu.com/p/54e74ce87404 最近在项目中需要在多个页面对同样的数据进行相关操作,于是便用到了FMDB数据库操作,以下便是FMDB的一些简单的使用方法.附 ...
- C#版清晰易懂TCP通信原理解析(附demo)
[转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...
- Vue插件编写、用法详解(附demo)
Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...
随机推荐
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- springmvc2 一个控制器写多个方法(非注解方式)
出处:http://blog.csdn.net/xuewenke/article/details/23895999 springmvc2 一个控制器写多个方法(非注解方式) 分类: spring 20 ...
- indows server 2008 多用户远程桌面连接设置(验证有效
然后,在运行框中输入 gpedit.msc 之后,点击确定或者直接按键盘上的回车键 计算机配置-->管理模板-->Windows组件---->远程桌面服务--->远程桌面会话 ...
- 初次接触nodejs,请多指教。
一 安装nodejs 1.下载node.js.在http://nodejs.org/download/下载最新版的node.exe文件,我下载时是v0.10.33.下载完成后,在F盘新建nodejs ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
- VS2012中丢失ArcGIS模板的解决方法
VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...
- webpack的配置
使用webpack工具需要配置一个根目录下的配置文件,文件名默认为webpack.condfig.js,配置文件导出一个模块对象,包含了webpack工具的相关配置参数,这个模块对象将会以参数形式被引 ...
- 1001. A+B Format (20)
原题连接:https://www.patest.cn/contests/pat-a-practise/1001 题目如下: Calculate a + b and output the sum in ...
- PHP好任性 —— 大小写敏感有两种规则,然而并没有什么特别原因
大小写敏感 变量.常量大小写敏感 大小写不敏感 类名.方法名.函数名.魔法变量大小写不敏感 原因 有人原引了Rasmus 在一次会议上的发言大意: "I'm definitely not a ...
- CSP的今世与未来
一.从两个工具说起 最近Google又推出了两款有关CSP利用的小工具,其一为CSP Evaluator,这是一个能够评估你当前输入的CSP能否帮助你有效避免XSS攻击的工具,其用法非常简单,在输入框 ...