[前言] 如果是Code First老鸟或者对Entity Framework不感兴趣,就不用浪费时间往下看了。
记得09年第一次接触ORM————Linq2Sql,从此对她的爱便一发不可收拾,一年后,新的工作用上了EF,突然感觉彷佛是生活中出现了一个与你的爱人一样优秀但却没有你爱人缺点的Girl,真的难以抗拒。后来又因为各种缘故,接触EF越来越少,直到最近没那么忙才重拾EF。
关于EF我就不废话了,如果是EF新人(对Code First而言我也绝对是个新人),个人觉得还是从Code First去学吧。
瞎诌结束,以下为本文主题。
由于园子里关于EF的介绍已经有很多,但是本人做Code First还是走了不少曲折之路(主要在Code=>DB),故而编写本文分享。在Code First中,编写完代码并运行之后,我们的Model会同步到Db中,但是往往我们需要的是编写完Model就生成数据库,而不是等UI部分完成并运行之后才看到数据库,借助NuGet程序包管理器可以让我们即时完成Code=>DB。
准备:1.本人开发工具为VS2012,使用的是.NET Framework 4.5(EF5);
2.然后确保已在VS扩展中安装了最新的“NuGet程序包管理器”;
3.常用的三行NuGet用于EF命令(当然可以直接用命令“get-help EntityFramework”获取):“Enable-Migrations” --在对应项目中启用、“Add-Migration <名称>” --搭建基架、“Update-Database” --提交(应用基于代码的迁移)
4.新建类库项目“CodeFirst”。
开始:
1.在vs打开“程序包管理控制台”,输入“get-help NuGet”回车,可以查看一些命令。
2. 在程序包管理控制台输入“Install-Package EntityFramework”,此过程必须保证机子联网,如未联网,本人有个法子,就是在项目中新建Entity Framework(如“ADO.NET实体数据模型”)项,然后再删除该项即可。上述命令执行前确保如下图所示说明
此时可以看到项目多了个文件“packages.config”,同样在引用下多了“EntityFramework”的程序集。而在解决方案目录下则多了文件夹“packages”(物理目录,非解决方案目录),假如我们要拷贝项目,则应连同该目录拷贝,否则到别的目录下再编译项目之前仍然重新需要执行“Install-Package EntityFramework”,这是在将解决方案添加到源码管理时需要注意的地方。
3.项目下添加项目文件夹“Models”,并在该文件夹编写以下三个类与一个枚举(EF5对枚举的支持是非常棒的):
/// <summary> /// 性别 /// </summary> public enum Gender { Female = 0, Male, LadyBoy }
/// <summary> /// 人名 /// </summary> public class PersonName { public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } } }
public abstract class BaseModel { public BaseModel() { this.CreatedTime = DateTime.Now; this.LastUpdatedTime = DateTime.Now; } public DateTime CreatedTime { get; set; } public string Creater { get; set; } public DateTime LastUpdatedTime { get; set; } public string LastUpdater { get; set; } }
[Table("UserInfo")] public class UserModel : BaseModel { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public string LoginName { get; set; } [MaxLength(50)] public string Password { get; set; } public int Age { get; set; } public Gender Gender { get; set; } public DateTime? LastLoginTime { get; set; } public PersonName Name { get; set; } }
4.在项目下继续新建类“CodeFirstDbContext”
public class CodeFirstDbContext : DbContext { public DbSet<UserModel> Users { get; set; } public CodeFirstDbContext() : base("DefautConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<UserModel>(); } }
5.在“程序包管理控制台”(注意第二步截图中所说的,以下关于NuGet命令均必须如此),输入“Enable-Migrations”回车,项目多了Migrations目录。
6.在解决方案下新建控制台项目“ConsoleUI”,再在该项目下新建文件夹“App_Data”(此步骤非必须,我系统未安装SQL Server,因而我将使用数据库文件,文件则位于当前刚创建的目录下)。
7.在DbContext所在的项目CodeFirst下的App.config下添加如下节点(注意不要添加到configSections节点之前)
<connectionStrings> <add name="DefautConnection" connectionString="data source=(LocalDB)v11.0;attachdbfilename=H:shujuVS2012CodeFirstConsoleUIApp_DataCodeFirstDb.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
8.在“程序包管理控制台”输入命令“Enable-Migrations”,保证无错误提示,继续输入“Add-Migration CreateDb”,注意CreateDb可由咱们自行定义。
此时VS生成了一个名字很长的cs文件,可以看到其为咱们创建数据表的代码,EF对枚举、复杂类型、实体继承都提供了非常棒的知识,我们此时可以修改相应代码以生成我们希望看到的表结构。
9.编写控制台程序以验证我们的程序(注意添加引用并添加app.config添加数据连接字符串)。
public static void Main() { UserModel model = new UserModel { Age = 27, Creater = "me", Gender = Gender.LadyBoy, LastUpdater = "me", LoginName = "admin", Name = new PersonName { FirstName = "san", LastName = "zhang" }, Password = "1234" }; using (CodeFirstDbContext context = new CodeFirstDbContext()) { context.Users.Add(model); context.SaveChanges(); }; Console.WriteLine("成功添加用户,接下来将获取。。。"); using (CodeFirstDbContext context = new CodeFirstDbContext()) { UserModel getModel = context.Users.FirstOrDefault(); Console.WriteLine("名字:{0},性别:{1},创建时间:{2}" , getModel.Name.FullName, getModel.Gender, getModel.CreatedTime); }; Console.Read(); }
10.收工。
完成之后就感觉很容易,由于我之前机子未联网而在做demo时颇费周折。在来看看我们用到的NuGet命令:
Install-Package EntityFramework
Enable-Migrations
Add-Migration
Update-Database