介 绍

  在旧的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。

  修改这个类的代码如下:

  public class Invoice
{
    public int ID { get; set; }
    public DateTime InvoiceDate { get; set; }
    public double Total { get; set; }
}

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

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

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

   public class LineItem
{
    public int ID { get; set; }
    public string ProductName { get; set; }
    public double ItemCost { get; set; }
    public double 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;
public class Accounting : DbContext
{
public DbSet<Invoice> Invoices { get; set; }
public DbSet<LineItem> LineItems { get; set; }
}

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

  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;
protected void 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中增加如下代码:

protected void Page_Load(object sender, EventArgs e)
{
Accounting db = new Accounting();
Invoice invoice = new Invoice
{
InvoiceDate = DateTime.Now,
Total = 1000
};
db.Invoices.Add(invoice);
db.SaveChanges();
db.Invoices.Load();
GridView1.DataSource = db.Invoices.Local.ToBindingList();
GridView1.DataBind();
}

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

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

protected void Page_Load(object sender, EventArgs e)
{
Accounting db = new Accounting();
Invoice invoice = new Invoice
{
ID = 1,
InvoiceDate = DateTime.Now,
Total = 900
};
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 框架在起作用。

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

protected void Page_Load(object sender, EventArgs e)
{
Accounting db = new Accounting();
Invoice invoice = new Invoice
{
ID = 1,
InvoiceDate = DateTime.Now,
Total = 900
};
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)修改其代码如下:

public class AccountingInitializer : 
System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>
{
protected override void Seed(Accounting context)
{
Invoice invoice = new Invoice { Total = 20, InvoiceDate = 
new DateTime(2011, 4, 14), Tax = 1.50 }; 
invoice.LineItems.Add(new LineItem 
{ ItemCost = 2, ProductName = "Test", Units = 4 }); 
invoice.LineItems.Add(new LineItem 
{ ItemCost = 4, ProductName = "Test 2", Units = 3 }); 
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。

实体框架Entity Framework 4.1快速入门的更多相关文章

  1. 实体框架(Entity Framework)快速入门--实例篇

    在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...

  2. 实体框架(Entity Framework)快速入门

    实体 框架 (Entity Framework )简介 实体框架Entity Framework 是 ADO .NET 中的一组支持 开发 面向数据的软件应用程序的技术.是微软的一个ORM框架. OR ...

  3. C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

    转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就 ...

  4. ADO.NET实体框架Entity Framework模型-基于元数据解析

           上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸 ...

  5. ADO.NET实体框架Entity Framework模型-基于XML解析

            最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表.主外键及每个字段的属性.先简单描述我解决这个问题从开始到最后的分析实现 ...

  6. [ORM] Entity Framework(1) CodeFirst快速入门

    Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案 对象关系映射(英语:Object Relational Mapping ...

  7. 实体框架—Entity Framework

    简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...

  8. PDF.NET SOD 开源框架红包派送活动 && 新手快速入门指引

    一.框架的由来  快速入门 有关框架的更多信息,请看框架官方主页! 本套框架的思想是借鉴Java平台的Hibernate 和 iBatis 而来,兼有ORM和SQL-MAP的特性,同时还参考了后来.N ...

  9. ORM框架Entity Framework

    博客园在推广ORM方面的确做了很大的贡献,很多的程序员开始使用ORM,不用写SQL的喜悦让他们激动不已,可是好景不长,他们很快发现众多的烦恼一个接一个的出现了. 很遗憾,我并不打算在这篇文章中解决这些 ...

随机推荐

  1. Linux的安全模式

    今天尝试了一下开机启动,在rc.local中进行设置,但是我写的java -jar transport.jar是一个Hold处理,无法退出:导致开机的时候一直停留在等待页面. 处理机制: 1. 在Li ...

  2. netty sample

    http://netty.io/wiki/ https://github.com/netty/netty/tree/master/example/src/main/java/io/netty/exam ...

  3. Webx常用接口

    最近在学Webx框架, 在了解webx的工作流程后, 必须要会使用自带的接口和类 常用的 Navigator  这个接口中只有两种类型的方法, 及重定向与转发, 一般用在screen包下的类(注意:s ...

  4. java和php实现RSA加密互通-b

    java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pe ...

  5. NOSQL Mongo入门学习笔记 - C++连接Mongodb(三)

    OS环境: Centos 7.1 release X86_64 编译环境: G++ 4.8.3 已经成功搭建好了Mongodb,也初步在命令行中的查询与写入数据的基本方法,现在通过C++来连接Mong ...

  6. wamp设置实现本机IP或者局域网访问 (转)

    <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all #以前是De ...

  7. Matlab中sortrows函数解析

    一.问题来源 返回检索到的数据(按相关度排序)在原始数据中的索引. 二.问题解析 x = [1 4 3 5; 1 3 2 6]:sortrows(x)其结果是按照row来排列,默认首先排第一列,1和1 ...

  8. BZOJ 1741: [Usaco2005 nov]Asteroids 穿越小行星群

    Description 贝茜想驾驶她的飞船穿过危险的小行星群.小行星群是一个NxN的网格(1≤N≤500),在网格内有K个小行星(1≤K≤10000). 幸运地是贝茜有一个很强大的武器,一次可以消除所 ...

  9. 深入js的面向对象学习篇(继承篇)——温故知新(三)

    写这篇有关继承的文章时,突然想起,几天前的面试.因为习惯在学习知识的时候加上自己的理解,很喜欢用自己话来解释,于是乎当面试被问起继承原理时,噼里啪啦一大堆都是自己组织的话,(也可能是因为个人紧张.外加 ...

  10. Akka官方文档翻译:Cluster Specification

    参加了CSDN的一个翻译项目,翻译Akka的文档.CSDN提供的翻译系统不好使,故先排版一下放在博客上. 5.1 集群规范 注意:本文档介绍了集群的设计理念.它分成两部分,第一部分描述了当前已经实现的 ...