(转)code first基础
转自: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。
修改这个类的代码如下:
{
publicint ID { get; set; }
public DateTime InvoiceDate { get; set; }
publicdouble Total { get; set; }
}
在我们的类中,有id这个属性,Entity框架会根据id这个属性,去生成数据库表中的对应字段id,如果类中没定义id这个属性,则会在数据库表文件中生成以“类文件名+ID”这样命名的字段。
在这个Invoice发票类中,存在多个条目LineItem,它们之间明显构成一对多的关系,所以我们先建立类LineItem类。
5) 同样,新增一个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类的引用,这里要用到的是集合类,如下代码:
同时要在Invovice类的构造函数中,进行初始化LineItem类,如下:
{
LineItems =new List<LineItem>();
}
在完成上面的步骤后,则Entity框架已可以从实体类中创建相关的数据库和表了,下面继续进行步骤二。
步骤2
接下来,我们要引用Entity框架的类库文件到我们的工程中。
1) 在工程资源管理器中,鼠标右键点击工程名字,在弹出的菜单中选择“添加引用”。
2) 在出现的如下图的界面中,选择System.Data.Entity ,并点确定完成:

3) 为工程继续增加一个新类,命名为Accounting.cs ,并且修改其代码如下:
publicclass Accounting : DbContext
{
{
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中进行添加数据库连接,如下:
providerName="System.Data.SqlClient"
connectionString="Data Source=(local);Initial Catalog=Accounting;Integrated Security=SSPI;"/>
5) 接着,在default.aspx 中添加gridview控件,并且编写如下代码:
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)如果这时运行工程,则会看到如下的错误提示:
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框架,自动把新增加的属性反映到数据库中:
{
// 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事件中编写如下代码:
{
//在启动过程中执行该段代码
System.Data.Entity.Database.SetInitializer<Accounting>
(new AccountingInitializer());
}
小 结
可以看到,Entity Framework 4.1的确方便了用户的开发操作,能让用户更专注于业务逻辑实体的开发,更符合OOP的思维方式,更多关于Entity Framework的操作,请参考微软的MSDN。
(转)code first基础的更多相关文章
- EF Core的Code First 基础
一.创建实体类与映射类 通过NuGet引用Microsoft.EntityFrameworkCore 1.创建实体类 Code First可以通过为实体类字段添加相应特性,来创建对应的字段类型等,举例 ...
- code first基础
随着.NET 4.0时代的到来,开发者越来越关注如何能加快开发效率,从而构建健壮的程序.而微软在.NET 4.0推出的Entity Framework,无疑是值得开发者去学习的,它实际上是微软的ADO ...
- Entity Framework 6.x Code First 基础
安装扩展工具 "Entity Framework Power Tools Beta4" 可选, 主要用于数据库变结构反向生成C#的对象和对应的mapping类.如果你熟悉mappi ...
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- 新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows)
原文出处:新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows) 这是我的文章备份 http://www.dotblogs.com.tw/ ...
- Entity Framework Code First学习系列
Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...
- 常见条码类型介绍(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码编码规则简单,误码率低.所能 ...
- 个人工具,编辑器visual studio code
个人收集的使用方法:简化版 主要基于基础web前端开发,visual studio code教程——基础使用.扩展插件安装使用 下载地址: https://visualstudio.microsoft ...
- 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code
前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...
随机推荐
- redis之RDB持久化与AOF持久化
Redis是一个键值对数据库服务器,服务器中通常包含着任意个非空数据库,而每个非空数据库中又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及它们的键值对统称为数据库状态. 因为Red ...
- [转] #ifndef#define#endif的用法(整理) 原作者:icwk
文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...
- 迷你MVVM框架 avalonjs 1.3.9发布
本次升级,avalon改进了许多内部方法,大大提升性能,并且带来异步刷新视图的新功能. ms-html内部不再使用异步 head元素中的avalon元素加入ms-skip指令 重构计算属性,现在超级轻 ...
- Hadoop 初始化系统
hadoop namenode -format 或者 hdfs namenode -format 2.执行hadoop sbin 目录下的 start-dfs.sh start-yarn.sh3.查看 ...
- 整合Struts2框架和Spring框架
-----------------------siwuxie095 整合 Struts2 框架和 Spring 框架 1 ...
- Java实现聚类算法k-means
2016-07 java简单实现聚类算法 但是有一个小问题,,,,我其实每次迭代之后(就是达不到我的收敛标准之前,聚类中心的误差达不到指定小的时候),虽然重新算了聚类中心,但是其实我的那些点并没有变, ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...
- MongoDB的文档、集合、数据库(二)
为了理解MongoDB的名词,可以将其于关系型数据库进行对比: 一.文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个 ...
- springMVC使用@RequestParam用于处理简单类型的绑定
使用@RequestParam常用于处理简单类型的绑定. value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入: req ...
- Tomcat端口被占用解决方法
端口被绑定,在命令提示符运行wmic process where "Caption='javaw.exe' and CommandLine like '%%bootstrap.jar%%'& ...