转自:http://tech.it168.com/a2011/0719/1220/000001220362_all.shtml

【IT168 技术】随着.NET 4.0时代的到来,开发者越来越关注如何能加快开发效率,从而构建健壮的程序。而微软在.NET 4.0推出的Entity Framework,无疑是值得开发者去学习的,它实际上是微软的ADO.NET的增强版本,是个ORM框架。在本文中,将以例子的形式简单介绍最新的 Entity Framework 4.1的基本用法。

  介 绍

  在旧的Entity 框架中,开发者可以从已存在的数据库中产生业务实体的模型,这种开发方法被称为数据库驱动的开发方法。而在4.1的Entity Framework中,支开发者先创建实体业务类,然后再产生相关的数据库文件,这种开发方法可以称为“代码先行”的开发方法。这种方法对于开发者来说是 很有好处的,首先,会让开发者从面向对象的思维角度出发,去构建业务逻辑中的实体模型,然后再根据实际的需要去生成数据库文件,是真正的面向对象的思维开 发方法。

  本文中要使用Entity Framework 4.1,这里提供下载该框架安装程序:Entity Framework 4.1

  同时,VS.NET 2010也是少不了的,而本文的配套代码,可以在这里下载:VS.NET 2010

   本文的例子将会创建两个类Invoice类和LineItem类。而本文产生的数据库命名为Accounting,并会产生两张表:Invoice和 LineItem。例子中的功能,还包括可以在gridview中对数据库中的数据进行增删改查,最后,还会演示如果类发生了变化了,如何让相应的数据库 也发生改变。

  步骤1

  1) 启动vs.net 2010;

  2) 新建立一个c#语言的asp.net web工程项目;

  3) 将工程命名为project EF4CodeFirst;

  4) 在工程资源管理器中,鼠标右键点击,然后新增一个类,将新增的类命名为Invoice.cs。

  修改这个类的代码如下:

  publicclass Invoice
{
    publicint ID { get; set; }
    public DateTime InvoiceDate { get; set; }
    publicdouble Total { get; set; }
}

  在我们的类中,有id这个属性,Entity框架会根据id这个属性,去生成数据库表中的对应字段id,如果类中没定义id这个属性,则会在数据库表文件中生成以“类文件名+ID”这样命名的字段。

  在这个Invoice发票类中,存在多个条目LineItem,它们之间明显构成一对多的关系,所以我们先建立类LineItem类。

  5) 同样,新增一个LineItem类,代码如下:

   publicclass LineItem
{
    publicint ID { get; set; }
    publicstring ProductName { get; set; }
    publicdouble ItemCost { get; set; }
    publicdouble Units { get; set; }
    public Invoice Invoice { get; set; }
}

  在这个类中,维持了对Invoice类的引用,同时也是关联了Invoice类。

  6)而在Invoice类中,也要增加LineItem类的引用,这里要用到的是集合类,如下代码:

   public ICollection<LineItem> LineItems { get; set; }

  同时要在Invovice类的构造函数中,进行初始化LineItem类,如下:

public Invoice()
{
    LineItems =new List<LineItem>();
}

  在完成上面的步骤后,则Entity框架已可以从实体类中创建相关的数据库和表了,下面继续进行步骤二。

  步骤2

  接下来,我们要引用Entity框架的类库文件到我们的工程中。

  1) 在工程资源管理器中,鼠标右键点击工程名字,在弹出的菜单中选择“添加引用”。

  2) 在出现的如下图的界面中,选择System.Data.Entity ,并点确定完成:

  3) 为工程继续增加一个新类,命名为Accounting.cs ,并且修改其代码如下:

using System.Data.Entity;
publicclass Accounting : DbContext
{
  public Accounting() : base("Accounting")
  {}
  
  public override void OnModelCreating(DbModelBuilder modelBuilder)

  {
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  }

  public DbSet<Invoice> Invoices { get; set; }
  public DbSet<LineItem> LineItems { get; set; }
}

  可以看到,该类继承了DbContext类,该类实际上是Entity的一个工具类,里面封装了很多有用的API,在Accounting类中,分别有两个DbSet类的实例,它们代表将要在数据库中生成的两个表。

  构造函数继承了积累构造函数,并将名为 “Accounting” 的连接字符串作为参数,以使用该字符串。如果不写该构造函数,将自动使用与该DbContext同名的连接字符串,也就是 name="Accounting" 的链接字符串。

  重写OnModelCreating方法,增加 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 是为了在数据库中生成表时,表名以单数形式出现,否则数据库中表名为:Invoices,LineItems。

  

  4)接着需要在web.config中进行添加数据库连接,如下:

<add name="Accounting"
providerName="System.Data.SqlClient"
connectionString="Data Source=(local);Initial Catalog=Accounting;Integrated Security=SSPI;"/>

  5) 接着,在default.aspx 中添加gridview控件,并且编写如下代码:

using System.Data.Entity;
protectedvoid Page_Load(object sender, EventArgs e)
{
Accounting db =new Accounting();
db.Invoices.Load();
GridView1.DataSource = db.Invoices.Local.ToBindingList();
GridView1.DataBind();
}

  记得这里必须引入System.Data.Entity类库,并且实例化Accounting对象的实例db,并调用其load方法,加载所有的Invoice数据(这里我们一般是加载一对多的一方的数据)。

  6)运行工程后,你会发现在SQL SERVER中,会出现了三张表,如下图:

  其中,分别是Invoice表和LineItem表,还有一张表EdmMetadata,是Entity框架为我们自动生成的,保存了数据库中的元数据。另外,可以看到在表LineItem中,Entity框架已经为我们自动生成了外键Invoice_ID,如下图:

  步骤三

  现在,既然数据库已经创建了,则可以为其增加一些数据了,在page_load中增加如下代码:

};
db.Invoices.Add(invoice);
db.SaveChanges();
db.Invoices.Load();
GridView1.DataSource = db.Invoices.Local.ToBindingList();
GridView1.DataBind();
}

  在这里我们实例化了Invoice类的一个实例,添加了相关的数据内容,然后使用db.Invoices.Add增加到Account类的DBSet属性中,最后调用savechanges方法保存到数据库中,运行后,可以看到如下效果:

  现在我们试下更新数据,代码如下:

};
db.Entry(invoice).State = EntityState.Modified;
db.SaveChanges();
db.Invoices.Load();
GridView1.DataSource = db.Invoices.Local.ToBindingList();
GridView1.DataBind();
}

  这里把invoice实例的成员变量的ID改为1,注意在更新时,设置其状态(state)为EntityState.Modified,表示是修改记录,最后再保存,运行后,可以看到数据库中的数据的确更新了,所有这些都是Entity 框架在起作用。

  最后学习删除记录,代码如下:

};
db.Invoices.Remove(invoice);
db.SaveChanges();
db.Invoices.Load();
GridView1.DataSource = db.Invoices.Local.ToBindingList();
GridView1.DataBind();
}

  这里只需要调用Remove方法,即可在数据库中删除该记录。

  步骤4

  在这个步骤中,我们学习如何改变数据模型。假设我们要在Invoice类中增加一个Tax的属性,也需要Entity框架同步在数据库中增加这个字段,下面演示其步骤:

  1)我们在Invoice类中增加Tax这个属性。

  2)如果这时运行工程,则会看到如下的错误提示:

  The model backing the 'Accounting' context has changed since the database was
  created. Either manually delete/update the database, or call
  Database.SetInitializer with an IDatabaseInitializer instance. For example, the
  DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate
  the database, and optionally seed it with new data.

  提示告诉我们,或者这个时候重新手工删除数据库或者使用代码的方法去完成,我们使用代码的方法去完成,只需要在Application_Start事件中编码如下,即可让Entity框架,自动把新增加的属性反映到数据库中:

void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
System.Data.Entity.Database.SetInitializer<Accounting>
(new System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>());
}

  3) 再次运行工程,会看到数据表中的确增加了Tax这个字段了,如下图:

  步骤5

 
 注意,在上面的步骤4中,如果类的属性发生变化,则其实是通过代码的方法,重新将旧的数据库DROP掉,然后再新建,这样的话费时费力,而可以通过另外
的一个方法实现,即还好我们可以在初始化的过程中添加测试数据,这样每次重新创建数据库的时候,测试数据就会自动加进去了,算是解决了一些问题,方法如
下:

  1)在工程项目中,新增加一个类,命名为AccountingInitializer.cs

  2)修改其代码如下:

});
context.Invoices.Add(invoice);
context.SaveChanges();
base.Seed(context);
}
}

  其中,在这个类中继承了DropCreateDatabaseIfModelChanges这个类,并且重写了seed这个方法,在这个方法中可以编写新增测试数据。要记得还需要在Application_OnStart事件中编写如下代码:

void Application_Start(object sender, EventArgs e)
{
//在启动过程中执行该段代码
System.Data.Entity.Database.SetInitializer<Accounting>
(new AccountingInitializer());
}

  小 结

  可以看到,Entity Framework 4.1的确方便了用户的开发操作,能让用户更专注于业务逻辑实体的开发,更符合OOP的思维方式,更多关于Entity Framework的操作,请参考微软的MSDN。

(转)code first基础的更多相关文章

  1. EF Core的Code First 基础

    一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...

  2. code first基础

    随着.NET 4.0时代的到来,开发者越来越关注如何能加快开发效率,从而构建健壮的程序.而微软在.NET 4.0推出的Entity Framework,无疑是值得开发者去学习的,它实际上是微软的ADO ...

  3. Entity Framework 6.x Code First 基础

    安装扩展工具 "Entity Framework Power Tools Beta4" 可选, 主要用于数据库变结构反向生成C#的对象和对应的mapping类.如果你熟悉mappi ...

  4. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  5. 新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows)

    原文出处:新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows) 这是我的文章备份  http://www.dotblogs.com.tw/ ...

  6. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  7. 常见条码类型介绍(Code 39、Code 128、EAN-8、EAN-13、EAN-128、ISSN、TIF、TIF-14、UPC(A)、UPC(E))

    常见条码类型,如下: 1.Code 39 Code 39,又称为"Code 3 of 9",是非零售市场中最常用的格式,用于盘存和跟踪.Code 39码编码规则简单,误码率低.所能 ...

  8. 个人工具,编辑器visual studio code

    个人收集的使用方法:简化版 主要基于基础web前端开发,visual studio code教程——基础使用.扩展插件安装使用 下载地址: https://visualstudio.microsoft ...

  9. 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code

    前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...

随机推荐

  1. How to Pronounce the I in ING

    How to Pronounce the I in ING Share Tweet Share Tagged With: ING Verbs The I in ING is the IH as in ...

  2. 迷你MVVM框架 avalonjs 学习教程18、一步步做一个todoMVC

    大凡出名的MVC,MVVM框架都有todo例子,我们也搞一下看看avalon是否这么便宜. 我们先从react的todo例子中扒一下HTML与CSS用用. <!doctype html> ...

  3. keras做DNN

    输入的数据集是10000行,31645列,其中前31644是特征,最后一列是标签值.训练集和测试集格式是一样的. 特征值都是0,1形式,表示有还是没有这个特征,标签值是0,1形式,2分类. impor ...

  4. 201671010127 2016—2017—2 Java怎样解决Java程序中中文乱码的问题。

    这是本次第二次分享新手在编程中遇到的问题,相信很多Java新手和我一样,在Java编程中会遇到中文乱码的情况,下面我就给大家分享我遇到问题和解决问题的具体过程. 我先用Notepad++写了一个如下的 ...

  5. VB 共享软件防破解设计技术初探(三)

    ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...

  6. 带环链表 linked list cycle

    1 [抄题]: 给定一个链表,判断它是否有环. [思维问题]: 反而不知道没有环怎么写了:快指针fast(奇数个元素)或fast.next(偶数个元素) == null [一句话思路]: 快指针走2步 ...

  7. [leetcode]215. Kth Largest Element in an Array 数组中第k大的元素

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  8. php多进程中的阻塞与非阻塞

    我们通过pcntl_fork来创建子进程,使用pcntl_wait和pcntl_waitpid来回收子进程. 子进程退出后,父进程没有及时回收,就会产生僵尸进程.   例1: <?php def ...

  9. APScheduler 浅析

    前言 APScheduler是python下的任务调度框架,全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架.它允许你像Linux下的Crontab那样 ...

  10. c3p0数据源配置

    Xml代码   <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: --> ...