你的位置:首页 > 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


跟团去云南旅游多少钱几月去云南旅游最好去云南的旅游团价格去云南旅游必去景点去云南旅游要多少钱上林霞客古渡景色怎么样?霞客古渡什么季节去最好? 上林霞客古渡景区地址?霞客古渡怎么样? 黄腾峡漂流小孩可以玩吗?清远黄腾峡有儿童乐园吗? 上林霞客古渡景区小孩怎么收费?霞客古渡儿童票价格? 惠州油菜花什么时候开?2015惠州油菜花开花时间? 惠州看油菜花的好地方?惠州哪里有油菜花? 白天和黑夜都可以欣赏的樱花园 惠州哪里有大片的薰衣草?惠州赏薰衣草的好地方? 尊道贵德,天人合一 感受福州道教文化 收获的季节 东辛农场耳边收割机在轰鸣 北碚将重点打“休闲度假”牌 重庆新开这些航线 冬季出游更方便了 泰国有什么特产水果? 母亲节是几月几号?2015年的母亲节是几月几号? 泰国曼谷暹罗公园好玩吗?泰国曼谷暹罗公园怎么样? 马尔代夫椰子岛有哪些住宿的地方? SQCB7M560GA1ME Datasheet SQCB7M560GA1ME Datasheet 06033A181JAT4A Datasheet 06033A181JAT4A Datasheet LD035C331JAB2A Datasheet LD035C331JAB2A Datasheet 佳木斯跟团港澳三日游 佳木斯跟团港澳三日游 佳木斯跟团港澳三日游 黑龙江去港澳5日游 黑龙江去港澳5日游 黑龙江去港澳5日游 牡丹江跟团港澳三日游 牡丹江跟团港澳三日游 牡丹江跟团港澳三日游