你的位置:首页 > ASP.net教程

[ASP.net教程][ORM] Entity Framework CodeFirst快速入门

    Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案
    对象关系映射(英语:Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

 

    下载:Install-Package EntityFramework -Version 6.1.3  (7.0只有CodeOnly模式)

    本节技术概览:数据库的安装,DB First,Model First,Code First(重点),DbContext,DbSet,CRUD例子,数据迁移以及事务管理。

 

LocalDB和SQL Server安装

  LocalDb是visual studio自带的,用来开发使用。运行是采用进程形式而非服务形式。

  位置:C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe(这是vs 2013的位置,使用VS2013开发人员工具输入sqllocaldb即可)

  SQL Server采用服务方式,方便连接管理。可以去itellyou.cn下载。

连接

  可以直接用vs连接这2种数据库。连接localdb

 

 

DB First,Model First

  

DB First采用通常的数据库先行的办法,常见,稳定。基本下一步下一步就能完成。

Model First在VS中 画模型图,来生成数据库和Object,不方便控制数据库。

这2个都会产生edmx文件(

在edmx模型查看中,不会把所有表都显示。当2个表的关系为多对多的时候,关系表会由一条多对多的线来表示。

在Model Browser中,可以看到存储过程,视图等非表的信息。

 

CodeFirst

  在EF7中,只有Code Only 说明Code First的重要性。在使用中,中小型项目,我也推荐使用,毕竟开发效率提高了不止一点点。

 

创建POCO

  public class App  {    public int Id { get; set; }    public string Name { get; set; }    public virtual ICollection<AppData> AppDatas { get; set; }  }  public class AppData  {    public int Id { get; set; }    public string Name { get; set; }    public string Value { get; set; }    public virtual App App { get; set; }  }

 创建DbContext

  public class AppContext : DbContext  {    public AppContext()      : base("AppDb")      //AppDb数据库库名    {          }    public DbSet<App> Apps { get; set; }    public DbSet<AppData> AppDatas { get; set; }  }

文件结构:

app.config

<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> <startup>  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework>  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">   <parameters>    <parameter value="mssqllocaldb" />   </parameters>  </defaultConnectionFactory>  <providers>   <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />  </providers> </entityFramework></configuration>

App.Config

 

Main方法

    static void Main(string[] args)    {      using (var ctx = new AppContext())      {        var app = new App() { Name = "博客园" };        var data = new[]        {          new AppData() {Name = "最新博客", Value = "XX", App = app},          new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}        };        ctx.Apps.Add(app);        ctx.AppDatas.AddRange(data);        ctx.SaveChanges();      }    }

连接数据库,查看数据库。

        

 

DbContext,DbSet

  在EF中,DbContext相当于一个数据库,DbSet则相当于一个数据表或者视图。

 

 

数据迁移

当业务改变,POCO类需要改变,表也需要改变。

EF的数据迁移通过 NuGet 来进行。

打开程序包管理器控制台(Package Manager Console),键入“get-help EntityFramework”命令,可以获得相关的帮助信息。

Enable-Migrations [-Force]

Add-Migration

Update-Database

Get-Migrations

 

 

如:加一个Title属性

  public class App  {    public int Id { get; set; }    public string Name { get; set; }    public string Title { get; set; } //add prop     public virtual ICollection<AppData> AppDatas { get; set; }  }

 

启动迁移功能

文件结构

 

生成改变

 

如果觉得太麻烦,可以使用以下方式

  public class AppContext : DbContext  {    public AppContext()      : base("AppDb")      //AppDb数据库库名,也可以换成连接字符串    {      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AppContext>());    }    public DbSet<App> Apps { get; set; }    public DbSet<AppData> AppDatas { get; set; }  }

 

 CRUD例子:

      using (var ctx = new AppContext())      {        //crud        #region create        var app = new App() { Name = "博客园" };        var data = new[]        {          new AppData() {Name = "最新博客", Value = "XX", App = app},          new AppData() {Name = "48小时阅读排行", Value = "YY", App = app}        };        ctx.Apps.Add(app);        ctx.AppDatas.AddRange(data);        ctx.SaveChanges();        #endregion        #region update        app.Name = "Never、C";        ctx.SaveChanges();        //or        ctx.Apps.AddOrUpdate(app);        #endregion        #region read        app = ctx.Apps.FirstOrDefault(o => o.Name == "博客园");        Console.WriteLine(app);        #endregion        #region delete        ctx.Apps.Remove(app);        #endregion      }

EF CRUD


事务管理

对于一个ORM框架,支持事务操作是必须的。

我们的每一次SaveChanges就是一个事务操作,只需要在所有更改都完成后,调用这个方法就可以了。

如果你不愿意,可以手动的开启事务的代码 :

DbConnection con = ((IObjectContextAdapter)ctx).ObjectContext.Connection;
con.Open();
using (var tran = con.BeginTransaction())
{
  // 这里才是事务中的代码

   tran.Commit();
}
con.Close();

 

以上是针对一个DbContext,也就是一个数据库的时候,如果操作涉及到多个数据库,还是使用分布式事务操作比较靠谱。

使用分布式事务处理,需要Windows系统的支持,所以,我们需要将系统的MSDTC服务开启。

 

代码下载:EFTest.zip