前言
Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能。使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后自动生成数据库。这样设计的好处在于我们可以针对概念模型进行所有数据操作而不必关系数据的存储关系,使我们可以更加自然的采用面向对象的方式进行面向数据的应用程序开发。
从某种角度来看,其实“Code First”和“Model First”区别并不是太明显,只是它不借助于实体数据模型设计器,而是直接通过编码(数据类)方式设计实体模型(这也是为什么最开始“Code First”被叫做“Code Only”的原因)。但是对于EF它的处理过程有所差别,例如我们使用Code First就不再需要EDM文件,所有的映射通过“数据注释”和“fluent API”进行映射和配置。另外需要注意的是“Code First”并不代表一定就必须通过数据类来定义模型,事实上也可以通过现有数据库生成数据类。
Code First 简单使用演示
第一步:还是添加一个控制台应用程序,然后在此项目中添加两个简单的实体类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CodeFirstTest { public class OrderDetail { public int ID { get; set; } public string Product { get; set; } public int OrderID { get; set; } public virtual Order Order { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CodeFirstTest { public class Order { public int ID { get; set; } public string Customer { get; set; } public DateTime OrderDate { get; set; } public virtual List<OrderDetail> OrderDetails { get; set; } } }
有了这两个类之后让我们定义一个数据库上下文,有了它我们就可以对数据进行增删改查操作了,这个类必须继承于"System.Data.Entity.DbContext”类以赋予它数据操作能力。因此接下来我们需要给这个应用安装EntityFramework包,因为到目前为止我们并没有引入EF框架相关的任何内容,我们需要引入EF相关程序集。但是我们有更好的选择那就是NuGet。通过NuGet进行在线安装:项目中右键选择"Manage NuGet Packages…”;选择Online;再选择“EntityFramework”;然后点击安装即可。不了解NuGet的朋友到这里看一下使用 NuGet 管理项目库。
数据库上下文操作类:
namespace CodeFirstTest { public class OrderTestContext:DbContext { public DbSet<Order> Orders { get;set;} public DbSet<OrderDetail> OrderDetails { get; set; } } }
代码调用实例
static void Main(string[] args) { using (var db = new OrderTestContext()) { Order Order = new Order(); Order.Customer = "aehyok"; Order.OrderDate = DateTime.Now; db.Orders.Add(Order); db.SaveChanges(); IQueryable<Order> Orders = from Orderes in db.Orders select Orderes; foreach (Order O in Orders) { Console.WriteLine("OrderID is {0},Customer is {1}", O.ID, O.Customer); } } Console.ReadLine(); }
调用效果
生成的数据库在这里,在此我们可以发现针对数据库,我们没有做任何的处理,没有建数据库,也没有进行配置,当然它应该会有默认的配置。
接下来我们来看一下,如何来配置。
我们可以在App的配置文件里添加一个数据库的链接字符串
<?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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="CodeFirstTest" connectionString="Data Source=.;Database=CodeFirstTest;UID=sa;PWD=sa123;" providerName="System.Data.SqlClient"></add> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> </entityFramework> </configuration>
里面主要添加了一个数据库链接字符串
针对数据库上下文操作类的更改
public class OrderTestContext:DbContext { public OrderTestContext(string connectionName) : base(connectionName) { } public DbSet<Order> Orders { get;set;} public DbSet<OrderDetail> OrderDetails { get; set; } }
主要是添加了一个构造函数带有一个参数的。然后在调用上也有所调整。
using (var db = new OrderTestContext("CodeFirstTest")) { Order Order = new Order(); Order.Customer = "aehyok"; Order.OrderDate = DateTime.Now; db.Orders.Add(Order); db.SaveChanges(); IQueryable<Order> Orders = from Orderes in db.Orders select Orderes; foreach (Order O in Orders) { Console.WriteLine("OrderID is {0},Customer is {1}", O.ID, O.Customer); } }
主要是针对实例化数据库操作上下文的
调用结果也是
同时打开Sql Server 发现也有了刚刚在配置文件中配置的那个数据库