Fork me on GitHub
Entity Framework 4.1 CodeFirst实例

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

本文中要使用Entity Framework 4.1,下面的地址提供4.1的安装包下载:http://down.qiannao.com/space/file/huwlnew/share/2011/8/9/EntityFramework4.1_-4e92-8054-529b-91cf.rar/.page

或者通过NuGet在线安装,选择下面的菜单:

clip_image002

在VS2010下脚的控制台输入:PM> install-package efcodefirst

显示内容如下,表示安装成功:

clip_image004

本文的例子将会创建两个类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()); 
}

MVC3+EF4.1学习系列

最近这段时间 又把MVC3和EF4.1系统的学了遍  并做个完整的小demo 加以巩固  在这里 想把学习经验和收获分享下  也是对自己这段时间的一个总结  记录下自己的学习过程

感谢这段时间 dotNetDR_  和小城岁月给的帮助~~

先说下自己的学习资料 MVC3的是  http://www.asp.net/mvc  看的书是  《Pro ASP.NET MVC 3 Framework》  没有看完 英文的 看的比较慢 但是感觉很不错 推荐给大家

这次写的这个完整的实例 是MVC学习网站的 EF学习实例   一共10部分 这个实例基本把EF的功能全部展示了出来  是个比较好的学习实例  有兴趣的可以先去看下 

我会把这个实例写出来 写出关键的翻译和自己的学习的一些体会

 

先把要写大纲列出来

1. 创建EF4.1 code first的实例

2 .基础的增删改查------(EF的实体状态的变化)

3. EF4.1+MVC3的   排序 刷选 分页---- (这里我用的是国产的基于ScottGu的PagedList<T>类和相关方法完善的分页--MVCPager)

4.处理EF的关系---(主要讲处理多对多关系 关系表里还有其他数据的处理方法)

5.关系的处理----(提前加载 ,延迟加载,多关系操作时的处理)

6.数据更新的处理

7.EF处理并发

8.重构项目----利用 Repository and Unit of Work

9.EF处理继承 关系

10.EF框架的一些常用技巧

11.MVC+EF处理树结构

12.利用Moq模拟数据库 进行单元测试

13.EF常见的问题

大概计划每天写一篇

主要都是讲EF4.1的  MVC会穿插在里面  MVC重点的技术 以后再专门开文章写~~

希望通过写这一系列 使得自己也能进一步提高 也能给大家带来帮助~~

 

VS2010 MVC3利用NuGet来安装EFCodeFirst package失败解决方法

2011年4月28日发表评论阅读评论
 

背景①:利用NuGet来安装EFCodeFirst方法

①我们可以利用NuGet包管理器(安装ASP.NET MVC3时会自动安装)来把EFCodeFirst类库添加到我们的Mvc工程中。这个类库使得我们可以直接使用code-first。点击“工具”菜单下的“Library Package Manager”子菜单下的“Add Library Package Reference”菜单选项;

②点击“Add Library Package Reference”菜单选项后,将会弹出一个对话框,标题为“Add Library Package Reference”;

③默认状态下,左边的“All”选项处于选择状态。因为还没有安装任何包,所以右边面板中显示“找不到任何项”。点击左边面板中的“online”选项,NuGet包管理器将会在服务器上检索所有当前能够获取的包;

④服务器上有几百个当前能够获取的包,现在我们只关注EFCodeFirst包。在右上角的搜索输入框中输入“EFCode”。在检索结果中,选择EFCodeFirst包,并且点击Install按钮安装包;

⑤点击了install按钮后,会弹出一个接受许可证窗口,在这个窗口中必须要点击“I Accept”按钮,接受许可证条款,安装才能继续进行。

⑥安装完毕后,点击close按钮。我们的Mvc工程中会自动加载EntityFramework程序集,其中包含了EFCodeFirst类库。

背景②:让事实说话

今天在Win 7下利用NuGet来安装EFCodeFirst package时,出现错误:This package(or one of its dependencies) contains PowerShell scripts and needs to be installed from the Package Manager Console。

师兄的XP下出现该提示的解决方法是打一个微软的补丁KB968930,下载地址:

http://www.microsoft.com/downloads/zh-cn/results.aspx?freetext=KB968930&displaylang=zh&stype=s_basic

里面有XP,Vista,Windows Server 2003及2008的32位,64位版本,但是没有Win 7版本的,

微软对该补丁的描述如下:

Windows XP 更新程序 (KB968930)
Windows Management Framework Core 程序包提供了适用于 IT 专业人员的已更新管理功能。

用于 Windows Server 2008 的 Windows PowerShell 2.0 和 WinRM 2.0 (KB968930)
Windows Management Framework Core 程序包包括 Windows PowerShell 2.0 和 Windows Remote Management (WinRM) 2.0。

解决鸟:后来根据提示找到了一个在控制台进行安装的解决方法:

①博客园原文内容如下:

I tried to install EntityFramework 4.1 on VS 2010 through NuGet. I searched and found the package through “Tools > Library Package Manager > Add Library Package Reference” tool and I got this error: “This package (or one of its dependencies) contains powershell scripts and needs to be installed from the package manager console.”. This is what I did to fix it:

Tools > Library Package Manager > Package Manager Console
PM > get-package -remote -filter entityframework
(got some results including EntityFramework 4.1.10311.0)
PM > install-package -id EntityFramework
Successfully added ‘EntityFramework …

②根据提示,在控制台安装会出现如下信息(以下蓝色内容为需要输入的命令):

Each package is licensed to you by its owner. Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. Some packages may include dependencies which are governed by additional licenses. Follow the package source (feed) URL to determine any dependencies.

PM> get-package -remote -filter entityframework

Id Version Description
– ——- ———–
Check_My_Box_Packages 1.1.0.2 This Package uses MvcScaffolding, EntityFramew…
Check_My_Box_Packages 1.1.0.3 This Package uses MvcScaffolding, EntityFramew…
EFCodeFirst 1.0 Legacy package, Code First is now included in …
EFCodeFirst 1.1 Legacy package, Code First is now included in …
EntityFramework 4.1.10311.0 DbContext API and Code First workflow for ADO….
EntityFramework 4.1.10331.0 DbContext API and Code First workflow for ADO….
EntityFramework.Patterns 0.2 Provides different patterns to be used with En…
EntityFramework.Sample 4.1 This sample blog model demonstrates the use of…
EntityFramework.SqlServerCompact 4.1.8482.1 Allows SQL Server Compact 4.0 to be used with …
EntityFrameworkProfiler 1.0.0.839 EntityFramework Profiler is a real-time visual…

PM> install-package -id EntityFramework
You are downloading EntityFramework from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkID=211010. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
已成功安装“EntityFramework 4.1.10331.0”
已成功将“EntityFramework 4.1.10331.0”添加到 MvcMovie

PM>

posted on 2012-05-10 17:13  HackerVirus  阅读(363)  评论(0编辑  收藏  举报