Entity Framework中有三种模式 Code First, Model First和Database First, Code First 是在EF4中新增的模式, 也跟NHibernate等ORM框架越来越接近了。
今天我们来做个 Code First 模式的 简单例子
Code First
为了支持以设计为中心的开发流程,EF4 还更多地支持以代码为中心 (code-centric) ,我们称为代码优先的开发,代码优先的开发支持更加优美的开发流程,它允许你:
在不使用设计器或者定义一个 XML 映射文件的情况下进行开发。
·允许编写简单的模型对象POCO (plain old classes),而不需要基类。
·通过"约定优于配置",使得数据库持久层不需要任何的配置
·也可以覆盖"约定优于配置",通过流畅的 API 来完全定制持层的映射。
Code First是基于Entity Framework的新的开发模式,原先只有Database First和Model First两种。Code First顾名思义,就是先用C#/VB.NET的类定义好你的领域模型,然后用这些类映射到现有的数据库或者产生新的数据库结构。Code First同样支持通过Data Annotations或fluent API进行定制化配置
Database First
是最老也是应用得最广泛的一种设计方式。如上文提到过的那样,Database First这种方式的设计高度依赖于数据库中表的结构,根据表及表间的关系来创建模型。如果后期需求有所变更或者功能有很大变化的话,需要涉及到更改数据库所付出的代价将会很大,因为之前编写好的代码将不再适用于新的表,我们必需重构以更改代码中的逻辑以适应更改之后的表。
Model First
是创建ADO.NET实体对象以及它们之间的关系,然后再指定到数据库的映射。这个实体对象即为Model。
首先在GuGet程序包管理器中 下载安装 EF
1.新建表数据模型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; namespace EFSample.Model { [Table("T_Car")] public class Car { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int CarId { get; set; } [StringLength(50)] [Column("Brand")] public string Brand { get; set; } [StringLength(50)] [Column("CarModel")] public string CarModel { get; set; } [StringLength(50)] [Column("Color")] public string Color { get; set; } [Column("Price")] public decimal Price { get; set; } } }
2. 数据生成器
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using EFSample.Model; namespace EFSample.DAL { /// <summary> /// DbContext 数据生成器 /// </summary> public class CarContext : DbContext { public CarContext() : base("MyConn") { } public DbSet<Car> CarSet { set; get; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
3.新建一个控制台应用程序 来操作数据
using System; using System.Collections.Generic; using System.Linq; using System.Text; using EFSample.DAL; using EFSample.Model; namespace EFSample.Demo { class Program { static void Main(string[] args) { using (var db = new CarContext()) { //直接执行Sql语句 db.Database.ExecuteSqlCommand("delete from T_Car"); var car = new Car { Brand = "宝马", CarModel = "Z4", Color = "白色", Price = 200 }; //批量添加记录 db.CarSet.Add(car); //提交到db db.SaveChanges(); //查询 var query = db.CarSet.Where(c => c.Brand == "宝马").AsQueryable(); //输出Sql语句 Console.WriteLine(query.ToString()); List<Car> orderEntities = query.ToList(); foreach (var order in orderEntities) { Console.WriteLine(String.Format("ID:{0}/CustomerName:{1}/Amount:{2}/ItemCount:{3}", order.CarId, order.Brand, order.CarModel, 0)); } } Console.WriteLine("ok!"); Console.Read(); } } }
4.配置文件App.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> <connectionStrings> <!--连接字符串,使用SQLSERVER LocalDb--> <add name="MyConn" connectionString="Data Source=.;Initial Catalog=CarDatabase;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
结果展示