之前逛园子的时候,不少大牛写的一些东西,什么AOP、DDD之类的,看过以后一头雾水,远望大牛,回过头看看本身,原来程序员的差距还能够这么大。每一个程序员都有个大牛梦想,固然小菜我也是,只是还在开始的路上。html
由于前几天研究easyui,准备写个mvc+ef+easyui的简单示例,固然这对不少人来讲很简单,有段时间也研究过别人写的,但这是小菜我第一次本身写,勿喷。并且这周安排给本身的任务:设计模式第五篇-控制反转(ioc),前段时间作些其余方面的事,设计模式也很久没写了,因此这周必须把它完成,想研究完ioc以后,试着再写上面的简单示例,把ioc融入到mvc中,想一想应该有搞头。程序员
关于Code First,昨晚无心间看到一位园友翻译的相关教程:http://www.cnblogs.com/qouoww/archive/2011/12/31/2309066.html,这边小弟先谢过,前面几篇还能够看下去,可是后面几篇就有点不知所云了,学习是一方面,实践是另外一方面,作的过程当中才能学到更多的东西,这边也试着写个关于Code First的小示例。数据库
本身动手,丰衣足食。windows
我使用的是vs2012,若是使用vs2010须要安装NuGet。设计模式
Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工做变得更加快捷方便。服务器
新建-项目-Visual C#-windows-控制台应用程序,命名为:CodeFirstDemo。
mvc
这边须要注意的是:选择.net framework的时候要4.0以上版本,要否则下面NuGet安装EntityFramework扩展的时候会报建立项目版本底没法完成安装的错误,.net framework改为4.0就能够了,可是换了一台电脑3.5版本测试安装又是好的,不知是个什么状况,反正.net framework版本最好选择4.0以上。
ide
新建好CodeFirstDemo项目后,咱们先来安装EntityFramework,项目-管理NuGet程序包-联机-搜索“EntityFramework”,下载安装。工具
安装完成后会在项目下自动添加EntityFramework引用:学习
在Program.cs代码文件中添加下面命名空间:
1 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中建立几个模型,日常咱们能够分离出来。
1 public class New 2 { 3 public int NewId { get; set; } 4 public string Title { get; set; } 5 6 public int NewTypeId { get; set; } 7 public virtual NewType NewType { get; set; } 8 } 9 10 public class NewType 11 { 12 public int NewTypeId { get; set; } 13 public string Name { get; set; } 14 15 public int BlogId { get; set; } 16 public virtual List<New> New { get; set; } 17 }
NewId和NewTypeId在建立的时候会作为表的主键,由于包含有ID关键字,若是不包含的话,须要咱们指定主键,要否则建立就会报未找到主键的错误,添加命名空间:
1 using System.ComponentModel.DataAnnotations;
并在属性前添加[Key]标注,指示此字段做为主键,例如:
1 [Key] 2 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默认是启动延迟加载的,咱们若是不须要也能够手动禁止:
1 db.Configuration.LazyLoadingEnabled = false;,
我对EF中上下文的理解:能够把上下文当作一个数据库控制器,咱们能够在其中查询、更改、删除数据,而后经过链接获取或是提交。就像是遥控车的遥控器同样,EF是这个遥控器的核心部件,天线是链接字符串,遥控车是数据库,这个比喻可能不是很恰当,但就是这个意思,你们都懂得。
1 public class NewsContext : DbContext 2 { 3 public DbSet<New> News { get; set; } 4 public DbSet<NewType> NewTypes { get; set; } 5 }
DbSet表示上下文中给定类型的全部实体的集合或可从数据库中查询的给定类型的全部实体的集合,就像是一个包裹,须要什么东西就往里面装什么东西。
在Program.cs的Main方法中填写代码:
1 using (var db = new NewsContext()) 2 { 3 Console.Write("输入新闻类型标题: "); 4 var name = Console.ReadLine(); 5 6 var type_Model = new NewType { Name = name }; 7 db.NewTypes.Add(type_Model); 8 db.SaveChanges(); 9 10 Console.WriteLine("查询新闻类型标题:"); 11 var search_type = Console.ReadLine(); 12 var query = from b in db.NewTypes 13 where b.Name == search_type 14 select b; 15 16 Console.WriteLine("查询结果:"); 17 foreach (var item in query) 18 { 19 Console.WriteLine(item.Name); 20 } 21 22 Console.ReadKey(); 23 }
上面代码建立一个上下文对象实例,经过该实例添加一个新闻实体,而后经过输入的值,linq查询结果输出。
经过上面的操做,咱们并无建立什么链接字符串和数据库操做,可是打开数据库就能够看到咱们经过Code First建立的数据库了。
我当时作的时候,运行代码没有错误,可是用.\SQLEXPRESS和localhost登录都看不到数据库,安装vs2012就给自动安装了localdb,由于我本地没 .\SQLEXPRESS,MSDN相关注解:
经过上面默认生成数据库规则能够看出,数据库名是项目命名空间+上下文,有时候咱们须要本身定义生成数据库名称,或是生成数据库到指定的服务器,并且有时候数据库迁移了,咱们不能再从新生成一遍吧,这时候咱们就要自定义数据库链接字符串了:
1 <connectionStrings> 2 <add name="NewContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=CodeFirstDemoDB;Trusted_Connection=true" /> 3 </connectionStrings>
须要注意的是:链接字符串的名称必需要和上下文一致,并且connectionStrings必须放在configuration节点内的最下面,若是放在最上面会报下面这种错误:
咱们从新按照上面的操做运行程序,就能够在指定的服务器.\SQLEXPRESS,生成指定的数据库CodeFirstDemoDB。
关于Code First 迁移其实就是咱们在更改模型的时候,数据库要相应的更改,打开工具-库程序包管理器-程序包管理器控制台。
1,例如咱们上面建立NewTypes表的时候,没有指定字段的长度,默认是建立字段类型是nvarchar(MAX),有时候咱们以为字段长度太长,须要修改一下字段长度,不要直接去修改数据库,而是在模型中修改:
1 [MaxLength(50)] 2 public string Name { get; set; }
MaxLength就是上面咱们说到DataAnnotations命名空间下的类型,这边咱们注意下,咱们在生成数据库的时候添加了一条数据,Name字段值是“newtype one”,看看咱们修改字段长度后,字段值是否发生变化?
2,在程序包管理器控制台输入“Enable-Migrations”命令来启用迁移,运行完成后在项目中会建立一个Migrations文件夹,下来有两类文件:
须要注意的是:在咱们生成数据库的时候,除了New和NewType表外,还有一个系统生成表__MigrationHistory,从表名上就能够看出是迁移历史记录表。
3,在程序包管理器控制台输入“Add-Migration Update-NewType-Name”命令,Add-Migration表示增长一个迁移,后面是迁移名称,这个咱们能够随便写,运行后会自动检测模型和数据库发生的变化,在Migrations文件夹下会生成一个“201403290930423_Update-NewType-Name.cs”文件,打开咱们能够看到更新内容:
1 public partial class UpdateNewTypeName : DbMigration 2 { 3 public override void Up() 4 { 5 AlterColumn("dbo.NewTypes", "Name", c => c.String(maxLength: 50)); 6 } 7 8 public override void Down() 9 { 10 AlterColumn("dbo.NewTypes", "Name", c => c.String()); 11 } 12 }
从上面能够看出就是咱们上面修改模型的内容,固然你也能够在这上面直接修改,好比你再加一个更新,能够一块儿提交到数据库。
4,在程序包管理器控制台输入“Update-Database”命令,表示将全部的迁移应用到数据库,打开数据库,咱们看一下效果:
从上面能够看出,字段Name的类型已经修改成nvarchar(50),并且字段值并无发生变化,能够证实,Code First迁移并非删除数据库再建立。
Code First迁移除了上面说的字段类型修改还有不少内容,好比添加字段,删除字段,删除表等等,但都是大同小异,能够触类旁通。
下载地址:http://pan.baidu.com/s/1i3DS9b3
凡事贵在开始,更贵在坚持,与你共勉。。。
若是你以为本篇文章对你有所帮助,请点击右下部“推荐”,^_^