随着.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中增加如下代码:

protectedvoid 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方法保存到数据库中,运行后,可以看到如下效果:

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

protectedvoid 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 框架在起作用。

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

protectedvoid 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)修改其代码如下:

publicclass AccountingInitializer :
System.Data.Entity.DropCreateDatabaseIfModelChanges<Accounting>
{
protectedoverridevoid 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

转载于:https://www.cnblogs.com/asks/p/4372790.html

code first基础相关推荐

  1. [译]Code First基础

    零.前言 介于鄙人也是初试牛刀,对于此工具的认识也有局限性.如若有任何错误的地方,还请各位大牛指正. 本文大部分内容翻译自MSDN库,地址:http://msdn.microsoft.com/zh-c ...

  2. uniapp授权登录微信支付宝小程序获取code和基础信息

    项目背景:采用uniapp框架开发微信和支付宝两端小程序,前端授权基础信息和code传给后端获取openid(微信)和user_id(支付宝)建立用户体系. 项目描述:之前分开用原生框架开发的时候,都 ...

  3. Entity Framework 6.x Code First 基础

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

  4. VS code配置c环境

    目录 前言 第一步.安装VS code 第二步.安装VS code的C/C++扩展 第三步.安装mingw-w64 并配置环境 最后.运行测试 前言 先说一下VScode是啥: VScode只是个代码 ...

  5. 在 VS Code 中开始使用 Python

    原文地址:https://code.visualstudio.com/docs/python/python-tutorial 在本教程中,您将使用 Python 3 在 Visual Studio C ...

  6. Fira Code字体中增加思源黑体支持中文字体

    在Fira Code字体基础上增加思源黑体,合并到一个字体中,解决类似sourceinsight mono模式下无法显示中文的问题 下载链接如下(不需要付费,免费下载的): FiraCode字体中增加 ...

  7. 找工作 50道编程题Java实现(32-50)

    程序32 左移右移 题目:取一个整数a从右端开始的4-7位. 分析:比如取123456789从右端开始的4-7位即:3456 1 package test50; 2 /* 3 * 题目:取一个整数a从 ...

  8. pyqt5如何循环遍历控件名_利用Python的PyQt5编写GUI界面教学,QT5还是比较难的

    由于学校课程的项目,最近最近在学习如何利用Python语言和SQL Server编写一个读者图书借阅.查询管理的小程序.以此为契机吧,自己便开始了学习之路~ 这篇文章主要介绍自己如何使用PyQt5编写 ...

  9. UA MATH636 信息论9 有限域简介

    UA MATH636 信息论9 有限域简介 域.有限域 有限域上的多项式的四则运算 有限域是研究Reed-Solomon code (RS code)的基础,RS code是一种非常常用的error- ...

最新文章

  1. U盘挂载,gedit,vi,文本模式中文乱码等等问题
  2. Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX
  3. HTML学习笔记之二(回到顶部 与 回到底部)
  4. Missing artifact com.sun:tools:jar 1.5.0 终极解决方法
  5. [云炬Python学习笔记] Python读取指定文件夹下的文件
  6. 题库练习7(最小公倍数、求立方根、字符串逆序、记负均正、字符串分割)
  7. [Leetcode] Sqrt(x)
  8. java控制台打印图片_java——控制台输入打印图形
  9. java 多线程日志_多线程 打印的日志出现重复行
  10. webtest 文章
  11. 添加的oracle语句,Oracle中Insert语句的总结
  12. Linux后台运行jar不产生nohup.out
  13. mysqlpxc集群
  14. python对数据进行统计分析_数据分析员用python做数据分析是怎么回事,需要用到python中的那些内容,具体是怎么操作的?...
  15. Xamarin.Android 引导页
  16. 关注可视化H5设计(待补充……)
  17. html制作3d动画效果,【分享】HTML5的Canvas制作3D动画效果分享
  18. AndroidQ 分屏窗口模式 (AMS部分)
  19. [附源码]java+ssm计算机毕业设计磐基建筑机械租赁有限公司机械租赁系统41c32(源码+程序+数据库+部署)
  20. Python爬虫爬取豆瓣书籍数据

热门文章

  1. 深度学习用途广:Nvidia工程师机智赶跑草坪上撒野的邻家喵星人
  2. linux下搭建mrbs会议室预定管理系统
  3. 神经网络:卷积神经网络
  4. typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...
  5. 【bzoj1029】【JSOI2007】建筑抢修
  6. cakephp2 框架下的 持久处理 不丢失数据库连接 后台挂起执行。
  7. 缺少物联网杀手级应用的运营商,到底该怎么办?
  8. CoreOS Linux Alpha的重大漏洞已修复
  9. ibatis增删改、批量增删改以及查询
  10. Android Handler的原理