ef codef the first tale需要新建一张表怎么操作

EF_Code_First:二级缓存_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
192页免费151页免费8页免费52页免费45页免费11页免费22页免费14页免费12页免费7页免费
喜欢此文档的还喜欢140页免费5页免费2页免费2页免费
EF_Code_First:二级缓存|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢Entity Framework Code First Migration | MistySoul
最近学习使用ASP.NET MVC 3开发一个信息管理系统,其中使用Entity Framework进行数据库操作时遇到了一个问题:由于思想的局限性或随着需求的改变,数据库的结构将会发生改变。那么在项目中通过代码(Code First Migration)如何来对数据库进行更新呢?来看下面这个例子。
假定原数据库中原有这样的一张User表,如下图(请点击图片放大之后查看,记得回退至本文^_^).
共有三个字段,主键ID,用户名Name,电子邮件Email。假设日后需要在User表中添加一个Password字段,那么在更新User实体中的代码同时,如何同时更新数据库中对应的表呢?
我们需要在描述User这个实体类的User.cs文件中添加相应的Password字段,如下
public class User
public int ID { }
[Required]
[Display(Name = "用户名")]
public string Name { }
[Required]
[Display(Name="电子邮件")]
[EmailAddress]
public string Email { }
//新增字段,且允许该字段为空,若不为空则需额外的对原有记录设置默认值工作,此处暂不考虑
[Display(Name = "密码")]
[DataType(DataType.Password)]
public string Password { }
12345678910111213141516171819
public class User&&{&&&&&&public int ID { get; set; }&&&&&&&[Required]&&&&&&[Display(Name = "用户名")]&&&&&&public string Name { get; set; }&&&&&&&[Required]&&&&&&[Display(Name="电子邮件")]&&&&&&[EmailAddress]&&&&&&public string Email { get; set; }&&&&&&&//新增字段,且允许该字段为空,若不为空则需额外的对原有记录设置默认值工作,此处暂不考虑&&&&&&[Display(Name = "密码")]&&&&&&[DataType(DataType.Password)]&&&&&&public string Password { get; set; }&&&}
实体类更新完毕,接下来就需要对更新数据库进行工作了。我们将使用一种称为Code First Migration的技术来实现该目的。
打开Visual Studio-&Tools-&Library Package Manager-&Package Manager Console
1.首次启用Code First Migration, 在Package Manager Console中输入Enable-Migrations命令,回车。VS会在项目中新建一个Migrations文件夹,此新文件夹包含下面两个文件:
Configuration 类。此类允许您针对上下文配置迁移的行为。对此,我们将使用默认配置。
因为在您的项目中只有一个 Code First 上下文,所以 Enable-Migrations 已自动填入要应用此配置的上下文类型中。
InitialCreate 迁移。此迁移已在启用迁移之前生成,因为我们事先让 Code First 自动创建了一个数据库。此基架迁移中的代码表示数据库中已创建的对象。在本例中,此类对象为 User表,其中包含 ID,Name 和 Email 列。文件名包含时间戳,这对于排序十分有帮助。
如果尚未创建数据库,则不会将此 InitialCreate 迁移添加到项目中。而是,首次调用 Add-Migration 时,用于创建这些表的代码将为新迁移搭建基架。
2.生成并运行Code First Migration
Code First Migration有两个主命令:Add-Migration和Update-Database.
Add-Migration 将根据自创建上次迁移以来您对模型(此处为User.cs)所做的更改,为下一次迁移搭建基架。
Update-Database 将所有挂起的迁移应用于数据库。
我们需要为迁移搭建基架以处理先前添加的新 Password属性。使用 Add-Migration 命令可以为这些迁移指定名称,我们将其称为 AddUserPassword。运行完成之后,在Migrations文件夹中可以看到刚生成的带有时间戳的基架文件。如下图,可以看到,我们对模型所做的更改,已经自动更新到了基架文件中(重载的Up()方法中)。这点博主感觉着实很方便,当然我们也可以根据实际需要自定义一些数据库更新操作。并且我们也可以将数据库迁移到特定版本(包括降级)。可以使用 –TargetMigration 开关降级到特定版本。此命令将执行特定版本之后所有新增的迁移的中的Down()方法中的操作。显然,Up()与Down()互为逆操作。
namespace MvcApplication1.Migrations
using System.Data.Entity.M
public partial class AddUserPassword : DbMigration
public override void Up()
AddColumn("dbo.Users", "Password", c =& c.String());
public override void Down()
DropColumn("dbo.Users", "Password");
123456789101112131415161718
namespace MvcApplication1.Migrations{&&&&using System;&&&&using System.Data.Entity.Migrations;&&&&&public partial class AddUserPassword : DbMigration&&&&{&&&&&&&&public override void Up()&&&&&&&&{&&&&&&&&&&&&AddColumn("dbo.Users", "Password", c =& c.String());&&&&&&&&}&&&&&&&&&public override void Down()&&&&&&&&{&&&&&&&&&&&&DropColumn("dbo.Users", "Password");&&&&&&&&}&&&&}}
现在,让我们使用 Update-Database 将此迁移应用于数据库。此时,数据库中User表中已经进行了更新,新增了Password字段,如下图。
For more detail information, please scan this web site from MSDN:
本条目发布于。属于分类。作者是。关于Entity Framework 的code first 模式,相信大家都不陌生了.本文就来看看实体继承在 codefirst里的用法.&第一步& 添加 code first 的环境这里为了方便,选用的是 VS2013 +& SQL SERVER 2014 LocalDb, 查看数据用 SQL Server Management Studio 2014工程我们选用最简单的控制台.新建完成控制台项目(这里以 EF_CodeFirst_Test 命名)以后,添加 EF 的库,可以用NuGet 的界面添加,也可以用命令,这里用命令添加在程序包管理器控制台(工具 &&& NuGet程序包管理器 && 程序包管理器控制台) 输入Install-Package EntityFramework EF_CodeFirst_Test#换上你自己的项目名接下来,在app.config里加入连接字符串&add name="CodeFirstModel" connectionString="data source=(LocalDb)\MSSQLLocalDb;initial catalog=TestDb;integrated security=Tmultipleactiveresultsets=Tapplication name=EntityFramework" providerName="System.Data.SqlClient" /&&!-- 同样的,换上你自己的数据库 --&第二步 编写实体类基类型public class BaseClass{
public long ID { }
public string Name { }}三个扩展类,这里为了合并一些表字段,加入了 注解,不然EF会把不同子类里的同名字段后面加上1& 2& 3 等的数字来区分.加入注解可以强制不同的子类在相同的类型下使用同一字段.注解相关的命名空间如下ponentModel.DataAponentModel.DataAnnotations.S这里要说明一下,在.net 4.5中 Schema里的一些字段放到了自带的类库里,而在.net 4 及.net 3.5 里是没有的,如果你用一个版本建立了项目,又切换了.net 版本,记得重新安装EF,以保证不要出现同一个类在两个库中同时出现导致无法编译.&下面是几个扩展类public class ExtendClass:BaseClass{
public string DescriptionString { }
[Required]
[Column("LongNum")]
public long LongNum { }}public class ExtendClass2 : BaseClass{
[Column("Version")]
public string Version { }
[Required]
[Column("IntNum")]
public int IntNum { }}public class ExtendClass3 : BaseClass{
[Column("Version")]
public string Version { }
[Required]
[Column("IntNum")]
public int IntNum { }
[Required]
[Column("LongNum")]
public long LongNum { }}&最后是数据库上下文public partial class CodeFirstModel : DbContext{
public CodeFirstModel()
: base("name=CodeFirstModel")
public virtual DbSet&ExtendClass& ExtendClass { }
public virtual DbSet&BaseClass& BaseClass { }
public virtual DbSet&ExtendClass2& ExtendClass2 { }
public virtual DbSet&ExtendClass3& ExtendClass3 { }}第三步 开始尝试&&建数据库在Main函数里加入下面代码并执行Database.SetInitializer(new DropCreateDatabaseIfModelChanges&CodeFirstModel&());using (var context = new CodeFirstModel()){
context.Database.Initialize(true);}然后我们可以在 SQL Server Management Studio& 里看到数据库,并且还有两个表从这张表上不难看出,在同一个基类下面继承出的不同实体, code first 会为我们创建同一张表来存储他们.第一个表是code first 的工作表,仅与模型的更新有关.第二个表者是真正的实体表.让我们看看这个表的构成.我们会发现,所有的子类的字段都在这里,因为我们用注解合并了一些数据字段,不然同名的字段会出现多个,并且后面补1,2,3 这些数字来区分.子类中虽然我们在字段上标了[Required],但是表中的字段仍然是可空的.不能想到,因为在这个实体里是必须的,但是其它的子类里就不一定了,所以,只有其类的[Required]标注会让EF 创建一个not null的字段.&第四步& 存一点数据看看吧&在Main 函数里插入点数据吧using(CodeFirstModel db = new CodeFirstModel()) {
BaseClass bc = new BaseClass { Name = "" };
db.BaseClass.Add(bc);
ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };
db.ExtendClass.Add(bc1);
ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };
db.ExtendClass2.Add(bc2);
db.SaveChanges();}&我们再来看看数据库里的数据好的,都存进去了,让我们试试往基类的实体集里插入子类实体修改Main 函数里添加的部分代码using(CodeFirstModel db = new CodeFirstModel()) {
//BaseClass bc = new BaseClass { Name = "" };
//db.BaseClass.Add(bc);
//ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };
//db.ExtendClass.Add(bc1);
//ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };
//db.ExtendClass2.Add(bc2);
ExtendClass3 bc3 = new ExtendClass3 { Name = "C3", Version = "9981", IntNum = 3000, LongNum = 0xFFFFFFFFFFL };
db.BaseClass.Add(bc3);
db.SaveChanges();}&执行后查看数据库然后我们发现,往基类的实体集里插子类实体,跟往子类的实体集中插入是一样的.&第五步 读点数据吧修改Main 函数与实体操作相关部分using(CodeFirstModel db = new CodeFirstModel()){
//BaseClass bc = new BaseClass { Name = "" };
//db.BaseClass.Add(bc);
//ExtendClass bc1= new ExtendClass() { Name = "王二", DescriptionString = "麻子" };
//db.ExtendClass.Add(bc1);
//ExtendClass2 bc2 = new ExtendClass2 { Name = "Sqlserver", Version = "2014" };
//db.ExtendClass2.Add(bc2);
//ExtendClass3 bc3 = new ExtendClass3 { Name = "C3", Version = "9981", IntNum = 3000, LongNum = 0xFFFFFFFFFFL };
//db.BaseClass.Add(bc3);
//db.SaveChanges();
foreach (var item in db.BaseClass)
var cbc3 = item as ExtendClass3;
if (cbc3 != null)
Console.Write(cbc3.ID);
Console.Write(":\t");
Console.WriteLine(cbc3.Name);
}我们可以看到执行的结果看到了吧,从基类的实体集里读到的,实际上是子类实体.是可以向下转型到对应的子类的.当然,向上转型就不说了.&小结&Entity Framework 的 codefirst 模式让我们可以把数据库中的实体当成是本地的实体来用.无疑,这让我们的代码有了更大的灵活性.但是同时,也让数据库看起来不那么友好了,因为里面多了实体映射的字段.&ORM框架在一定程度上屏蔽了数据库的差异,但同时也屏蔽了一些数据库的优势.而codefirst 更是让一些复杂的数据切分及用存储过程加速处理变得不那么友好了.引用一句老话,不要为了做IT为做IT,当我们的ORM无法快速的达到我们预期的目的时,不妨把ORM 拿掉,用最原始的驱动加上手写的SQL和存储过程来做应用.
.../Code first 它们应用起来有区别吗?性能不是一样吗?都继承自DB...刚刚学,看了一堆相关的上实例。code first也是要继承DBContext,Model first的也是一样,我直接就一个ADO 实体数据模型难到性能就差了?不懂咧,都是继承自...【译著】Code First :使用Entity. Framework编程(5)[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为A..._第七城市这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十一篇:为ASP MVC应用程序实现继承 原文:Implementing ...EF Code First 学习笔记:表映射 - Gyoung - 博客园【求解】EF codefirst 继承问题_博问_博客园假设有abcd继承类:a抽象类,b继承a,c继承a,d继承cef的继承分3种:tph、tpt、tph不考虑了,因为一个继承体系一个表的字段都要可为空成行;tpt的话就是要...Entity Framework Code First (一)Conventions - 舍长 - 博客园 Code First 使得你能够通过C#的类来描述一个模型,模型如何被发现/检测就是通过一些约定(Conventions)。Conventions 就是一系列规则的集合,被用于对基于类别定义的...第二章:Code First概览 - 第1页 - 『 Entity Framework / ...注意尽管在Lodging类中没有外键属性指向Destination类(如DestinationId),Code First仍然使用默认规则创建了一个,形如[Name of navigation property]_[Primary Key of ...Links About Code First - 做更好的自己&&费强的博客 - ITeye技术...EF 4.1 Code First Walkthrough (Annotation)EF Feature CTP5: Code First... 继承:子父类一个表,每一个类一个表,每个子类一个表 Relationship Fluent ...EF Code First:数据查询 - 51CTOEF的CodeFirst是个好东西,让我们完全不用考虑数据库端(注意,这里并不是说不... IQueryable&T&、IEnumerable&T&类型的所有数据查询的扩展方法(由于DbSet&T&继承...Code First :使用Entity. Framework编程 对关系使用默..._易博客 一旦Code First已经创建了模型与关系,EF框架就会将这些关系视为与使用EDMX文件映射的POCO是类似的。所有你在使用POCO对象对EF框架编程的方法和规则仍然适用。例如,......有继承-entity-framework-实体,ef-code-first-第一 - CodeGoEF代码优先“无效的列名'鉴'”,但没有继承 entity-framework-实体,ef-code-first-第一 我有我的数据库名为哨兵表(见下面的CREATE TABLE它有一个主键,一对...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP MVC...这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十二篇:为ASP MVC应用程序使用高级功能 原文: ...当代码优先(Code First)不是先写代码 | 波斯马
在最近发布的EF4.1中包含支持使用代码优先(Code First)的方式进行EF开发。目前实体框架已经支持三种方式:数据库优先、模型优先,以及代码优先。然而,代码优先...EF Code First 和 ASP MVC3 工具更新 - IT技术博客 - 秋色园 原文名称:EF Code First and Data Scaffolding with the ASP MVC 3 Tools Update 原文:Entity Framework - 使用Code First模式 - 天空的垃圾桶- 点部落印象没记错的话,其实在EntityFramework 4.1的时候,Code First模式就已经出来了,但是使用后,觉得卡卡的,再加上一些问题( 下一篇会提到 ),所以也没有真正的好好...关于code first自关联和多对多-CSDN论坛-CSDN-中国最大的IT...6条回复&-&发帖时间:&日CodeFirst New Database 使用Migration 和Fluent API-A..._第七城市C# ORM—Entity Framework 之Code first(代码优先)(二)- 技术话题... 一、EntityFrameworkCodefirst(代码优先)使用过程 1.1EntityFramework代码优先简介 不得不提EntityFrameworkCodeFirst这个介于牛A与牛C之间的功能,从4.1开始的Code...VS2010自动生成的EF的那个DEMX和CodeFirst 中的POCO问题_已解决_...看到园子里面都是CodeFirst, 不知道这个和VS2010自动生成的那个DEMX中的实体类... 对于我来说,更现实的好处是我可以完全控制实体类,比如说继承。自动生成的实体...如何使用CodeFirst进行数据迁移_百度知道1个回答 - 提问时间: 日如果你还在为 支持xxx上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库 找到你的数据库上下文所在的类库(一般都是写在项目中...用efcodefirst和aspmvc3进行类级别模型验证[ASP教程]Entity Framework Code First 学习日记(8)_郑少群...通过上面两篇日记,我相信大家已经知道了Entity Framework Code First如何根据类之间的依赖关系推断并建立数据库中表之间的一对多和多对多关系。这次日记我们将详细...顶者有分!Code First 共用数据库的问题。-CSDN论坛-CSDN-中国...26条回复&-&发帖时间:&日Entity Framework Code First 学习日-企业级应用架构(NHibernater...但是当我们通过Fluent API改变数据库映射时,Code First会如何处理与新的数据库映射不匹配的数据库呢?通过Code First提供的Database类的SetInitializer方法设定Code First...[ASP教程]Entity Framework Code First使用者的福音 --- EF ...使用MVC 5的EF6 Code First 入门系列:为ASP MVC应用程序创建...如何使用CodeFirst进行数据迁移_百度知道1个回答 - 提问时间: 日如果你还在为 支持xxx上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库 找到你的数据库上下文所在的类库(一般都是写在项目中......的 EF6 Code First 入门 系列:为ASP MVC应用程序实现继承 ...这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十一篇:为ASP MVC应用程序实现继承 原文:Implementing ...C# ORM—Entity Framework 之Code first(代码优先)(二) - 萌萌的... 不得不提Entity Framework Code First这个介于牛A与牛C之间的功能,从4.1 开始的Code first使程序员,使软件开发流程进入一个更加方便快捷的时代。 Code First是...Entity Framework学习(一)CodeFirst入门 - 天方 - 博客园CodeFirst是EntityFramework 4.1后新增的一种映射方式,在这种方式下,开发人员只需要编写代码,由ORM框架自动动创建模型和数据库,数据库则可看作类似于XML一样序列化...EF6 CodeFirst双向一对一非主键关联怎么指定-CSDN论坛-CSDN-...5条回复&-&发帖时间:&日[ASP教程]EF Code-First 自定义表映射_郑少群个人图文EF Code-First 自定义表映射
16:48:11| 分类: Entity Framework |字号 订阅 场景1:自定义表名 如果我们定义的类如下 但是,数据库中的表名...Code First 关系 Fluent APICode First 约定非常适合根据指向子集合或单个类的属性识别类之间的常见关系。当类不使用外键时,Code First 可以推断数据库外键。但有时类提供的信息不足,Code ...EF Code First,entity framework.数据表发生改变后如何处理
[问题点数:40分,结帖人wlmstar]
EF Code First,entity framework.数据表发生改变后如何处理
[问题点数:40分,结帖人wlmstar]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2011年9月 总版技术专家分月排行榜第一2011年8月 总版技术专家分月排行榜第一2011年7月 总版技术专家分月排行榜第一2011年6月 总版技术专家分月排行榜第一2011年5月 总版技术专家分月排行榜第一2011年4月 总版技术专家分月排行榜第一
2011年3月 总版技术专家分月排行榜第二2011年2月 总版技术专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。英文渣水平,大伙凑合着看吧&&这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第二篇:实现基本的CRUD功能原文:Implementing Basic CRUD Functionality with the Entity Framework in ASP.NET MVC Application&译文版权所有,谢绝全文转载&&但你可以在你的网站上添加到该教程的链接。在之前的教程中,我们使用实体框架及SQL Server LocalDB创建了一个用来存储和显示数据的MVC应用程序。在本教程中,你将审阅并定义 MVC脚手架在控制器和视图中自动为您创建的CRUD(创建、读取、更新、删除)代码。注意:通常我们实现仓储模式,即在你的控制器和数据存取层之间创建一个抽象层来存取数据。为了保持教程的简洁并将注意力聚焦在如何使用实体框架上,我们在本教程中没有使用仓储模式。关于更多的信息,请参阅ASP.NET Data Access Content Map。在本教程中,你将建立以下Web页面:创建一个详细页面在学生索引页面中,脚手架代码将Enrollments属性排除在外,因为该属性是一个集合。在详细页面中,我们将在HTML表格中显示集合中的内容。在Student控制器中,Details视图中的动作方法使用Find方法来检索单个学生实体。 1
public ActionResult Details(int? id) 2
if (id == null) 4
return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 6
Student student = db.Students.Find(id); 8
if (student == null) 9
return HttpNotFound();11
return View(student);13
}索引页上详细信息超链接的路由数据中的键值以id参数传递给方法用于检索。打开Details视图,每个字段都使用DisplayFor帮助器来呈现数据,如下面的代码所示:
@Html.DisplayNameFor(model =& model.LastName)
@Html.DisplayFor(model =& model.LastName)
&/dd&&在EnrollmentData字段后,&/dl&标签之前,将下列高亮代码添加到显示列表中:
@Html.DisplayFor(model =& model.EnrollmentDate)
@Html.DisplayNameFor(model =& model.Enrollments)
&table class="table"&
&th&Course Title&/th&
&th&Grade&/th&
@foreach (var item in Model.Enrollments)
@Html.DisplayFor(modelItem =& item.Course.Title)
@Html.DisplayFor(modelItem =& item.Grade)
&/dl&&/div&如果代码缩进有问题,你可以在粘贴过代码后按下Ctrl-K-D来纠正它。&此段代码遍历Enrollments导航属性中的实体,在遍历到的每个Enrollment实体中,显示出课程标题和成绩。课程标题从Enrollments实体下的Course导航属性中的Course实体中获取。所有这些数据是在需要时自动从数据库检索到的。(换句话说,在此处您正在使用延迟加载。你没有指定Courses导航属性是需要预先加载的,所以在同一次查询中,只有学生的数据从数据库中查询并读取。相反,当您第一次尝试访问Enrollments导航属性时,一个新查询发送到数据库以检索数据。您可以在这里阅读更多关于延迟加载和预先加载的相关信息。)运行项目,点击学生选项卡并点击Alexander的详情连接。(如果你按下Ctrl+F5时,Details.cshtml文件时打开的,你会收到一个HTTP 400错误页面。因为VS会认为你想要查看Details页面而直接打开该页面。由于不是从连接点击进入该页面,所以页面无法获得所需的参数而发生错误。在这种情况下,你需要从URL移除Student/Details然后重试。或者关闭浏览器,右键点击项目,点击视图,然后点击在浏览器中查看。)你可以看到你选择学生的课程及成绩。更新创建页面在Student控制器中,使用以下的代码添加一个try-catch代码块并从Bind特性中删除ID属性来替换脚手架生成的HttpPost创建方法。 1
[HttpPost] 2
[ValidateAntiForgeryToken] 3
public ActionResult Create([Bind(Include="LastName,FirstMidName,EnrollmentDate")] Student student) 4
if (ModelState.IsValid) 8
db.Students.Add(student);10
db.SaveChanges();11
return RedirectToAction("Index");12
catch (DataException)15
ModelState.AddModelError("", "保存数据时出现错误。请重试,如果问题依旧存在请联系系统管理员。");17
return View(student);19
}这段代码将ASP.NET MVC模型绑定器创建的Student实体添加到学生实体集合并保存到数据库中。(模型绑定器是能够使你更轻松地处理表单提交数据的ASP.NET MVC功能;模型绑定器将提交的表单值转换为CLR值并将它们传递给动作方法中的参数。在本例中,模型绑定器使用了Form表单集合中的值来实例化了一个学生实体。)因为ID是主键值,在插入新纪录时,SQL Server会自动设置该值,所以我们将ID从Bind特性中删除来禁止用户设置该值。安全注意事项:ValidateAntiForgeryToken属性有助于防止跨站请求伪造攻击,它需要在视图中相应地设置Html.AntiForgeryToken()语句,您将在后面看到。Bind特性用于防止&过多发布&攻击。举例来说,假设Student实体中包含一个Secert字段,你不想让此属性由Web页面来进行更新,所以你没有在页面上放置Secert的相应输入框。但黑客可以通过工具强行附加Secert字段即相应值到表单中并发送给服务器端。在没有使用Bind的默认情况下,模型绑定器会自动遍历提交过来的所有表单值并尝试更新到实体中,所以Secert也会得到更新&&使用黑客强行附加的值。安全的做法是使用Bind特性的Include参数,可以让你指定那些字段是由模型绑定器来进行更新的,也可以相反地使用Exclude来排除你不想让模型绑定器来进行更新的属性。我们推荐使用Include的理由是,如果对实体添加了新的属性,Exclude是不会自动更新的,新属性会默认被模型绑定器进行更新。另一种替代方法是使用ViewModel。ViewModel中仅包含你想要绑定的属性。在模型绑定器完成对ViewModel的更新后,将ViewModel中的属性复制到实体的实例已完成更新。try-catch块是除了Bind特性外您对脚手架代码所做的唯一更改。如果在保存时有一个源于DataException的异常被引发,一个通用的错误消息被显示出来。由于DataException错误有时会由外部的应用程序引发,而不是程序编写的错误,所以建议用户进行再次尝试。此外,虽然该实例中没有实现,在生产环境下,所有的应用程序错误都应该被记录下来。Create.cshtml的代码类似Details.cshtml的,除了DisplayFor被EditorFor和ValidationMessageFor帮助器替代了。下面是相关的代码:
&div class="form-group"&
@Html.LabelFor(model =& model.LastName, new { @class = "control-label col-md-2" })
&div class="col-md-10"&
@Html.EditorFor(model =& model.LastName)
@Html.ValidationMessageFor(model =& model.LastName)
&/div&Create.cshtml还包含@Html.AntiForgeryToken()方法和控制器中的ValidateAntiForgeryToken特性,已防止跨站请求伪造攻击。Create.cshtml无需任何更改。通过选择学生选项卡,单击新创建运行该页面。输入姓名和无效的日期,然后单击Create查看错误消息。这是默认情况下的服务器段验证。在以后的教程中您会看到如何添加特性并生成客户端验证。以下突出显示的代码显示了创建方法中的模型验证检查。if (ModelState.IsValid){
db.Students.Add(student);
db.SaveChanges();
return RedirectToAction("Index");}将日期更改为一个有效的值,单击创建,然后参阅索引页面中显示的新学生。更新编辑HttpPost页面在Student控制器中,HttpGet Edit方法(没有HttpPost特性的那一个)使用Find方法来检索所选择的Student实体,正如你在Details方法中看到的一样。您不需要更新此方法。使用以下代码以添加一个try-catch块来替换HttpPost Edit方法: 1
[HttpPost] 2
[ValidateAntiForgeryToken] 3
public ActionResult Edit([Bind(Include="ID,LastName,FirstMidName,EnrollmentDate")] Student student) 4
if (ModelState.IsValid) 8
db.Entry(student).State = EntityState.M10
db.SaveChanges();11
return RedirectToAction("Index");12
(DataException)15
ModelState.AddModelError("","无法保存变更,请重试,如果问题依旧,请联系管理员。")17
return View(student);19
}这段代码类似于你在HttpPost Create方法中看到的那样,但不是将由模型绑定器创建的提示添加到实体集,这段代码设置实体上的标志位,表明它已经被更改。当调用SaveChanges方法时,Modified标志使实体框架来创建SQL语句并执行以更新数据库。数据库中该行的所有列都将被更新,包括哪些用户没有改变的,并发冲突被忽略。实体状态和附加和调用SaveChanges方法数据库上下文会跟踪内存中的实体是否与数据库中的行保持同步。并根据同步的信息来确定调用SaveChanges方法时会发生什么。例如,让你传递一个新实体给Add方法,该实体的状态设置为Added。然后您调用SaveChanges方法时,数据库上下文会生成一个SQL Insert命令以插入数据。一个实体可能处于以下状态之一:Added。该实体尚未在数据库中。SaveChanges方法将发出一个Insert语句。Unchanged。SaveChanges对该实体什么都不需要做。当你从数据库读出一个实体时,该实体就为这一状态。Modified。某些或所有实体的属性值已都被更改。SaveChanges将发出一个Update语句。Deleted。该实体已经被标志为删除。SaveChanges将发出一个Delete语句。Detached。该实体没有被跟踪的数据库上下文。在桌面应用程序中,状态变化通常是自动设置的。在桌面型的应用程序中,你看到一个实体并更改它的一些属性值,将导致它的实体状态自动更改为Modified。然后你调用SaveChanges,实体框架生成一个SQL Update来更新你进行了变更的属性。Web应用程序的断开连接性质不允许这种连续序列。数据库上下文在读取到实体并将其呈现在页面上,之后便被销毁。当HttpPost Edit动作方法被调用时,一个新请求被处理,你将获取一个新的数据库上下文的实例。所以你必须手动设置实体状态为Modified,然后你调用SaveChanges,实体框架更新数据库中的所有的数据行,因为上下文没有办法知道那个属性是你进行了变更的。如果你想在SQL Update语句只更新用户实际更改的字段,你可以以某种方式保存原来的值(比如隐藏字段),这样在调用HttpPost Edit方法时就可以使用它们。然后,你可以使用原值来创建一个Student实体,调用原始版本的Attach方法更新实体的值到新值,然后调用SaveChanges。更多信息请参见MSDN上的Entity states and SaveChanges&和 Local Data。如同你在Create.cshtml中见到的一样,Edit.cshtml中的HTML和Razor代码无需更改。通过选择学生选项卡,单击一个学生的编辑超链接运行该页面。改变一些数据并单击保存,你可以在索引页面中看到你所做出的更改。更新删除页面在学生控制器中,HttpGet Delete方法的模板代码使用Find方法检索所选的Student实体,正如你在Details和Edit方法中看到的那样。然而,调用SaveChanges失败时的错误信息需要修正,你需要向该方法和视图中添加一些功能。类似你之前看到的更新和创建操作,删除操作需要两个动作方法。Get请求用来显示一个视图,让用户有机会批准或取消删除操作。如果用户批准,POST请求被创建,HttpPost Delete方法被调用,然后该方法将实际执行删除操作。您将添加一个try-catch块到HttpPost Delete方法来处理数据库更新时可能发生的任何错误。如果出现了错误,则HttpPost Delete方法调用HttpGet Delete方法,向其传递一个参数表明发生了错误。HttpGet Delete方法重新显示带错误消息的提示页面,给用户一个机会,取消或重试。使用下面的代码更新HttpGet Delete方法: 1
public ActionResult Delete(int? id,bool? saveChangesError = false) 2
if (id == null) 4
return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 6
if (saveChangesError.GetValueOrDefault()) 8
ViewBag.ErrorMessage = "删除错误,请重试。如果错误依旧,请联系管理员。";10
Student student = db.Students.Find(id);12
if (student == null)13
return HttpNotFound();15
return View(student);17
}此代码接受一个可选择参数,指示该方法是否是由保存更改后出现了故障的的方法调用的。在HttpGet Delete方法不是由之前出现了错误的方法被调用的,该参数为false。当HttpPost Delete出现了错误,参数为true并且错误信息被传递给视图。使用下面的代码替换HttpPost Delete动作方法(名称为DeleteConfirmed的那个)用来执行删除操作并捕获任何数据库更新错误。 1
[HttpPost] 2
[ValidateAntiForgeryToken] 3
public ActionResult Delete(int id) 4
Student student = db.Students.Find(id); 8
db.Students.Remove(student); 9
db.SaveChanges();10
catch(DataException)12
return RedirectToAction("Delete", new { id = id, saveChangesError = true });14
return RedirectToAction("Index");16
}这段代码从数据库中检索要删除的实体,然后调用Remove方法将实体的状态设置为Deleted。当调用SaveChanges命令时,数据库上下文将生成SQL Delete命令将实体从数据库中删除。此外,我们将动作方法从DeleteConfirmed改为Delete。脚手架代码将DeleteConfirmed方法命名为HttpPost Delete动作以设置一个唯一的签名(CLR需要有不同的方法参数来重载方法)。现在,方法签名是唯一的,基于MVC的约定在可以让你通过使用HttpPost和HttpGet特性来使用相同名称的删除方法。如果在一个高容量应用程序中改善性能是优先事项,你可以避免不必须要的SQL查询,使用下面的代码替换Find和Remove方法:Student studentToDelete = new Student() { ID = id };db.Entry(studentToDelete).State = EntityState.D这段代码使用唯一的一个主键值实例化了一个学生实体,然后将实体状态设置为Deleted。这便是实体框架删除一个实体所需要的全部信息。要注意HttpGet Delete方法不会执行数据删除。在一个Get请求响应中执行删除动作(或者创建、修改等对数据进行变更的动作)将带来安全风险。有关风险的详细信息请参见ASP.NET MVC Tip #46 & Don't use Delete Links because they create Security Holes。在Delete.cshtml中,在H2和H3标签之间添加错误信息,如下面的代码:&h2&Delete&/h2&&p class="error"&@ViewBag.ErrorMessage&/p&&h3&Are you sure you want to delete this?&/h3&运行程序,点击学生选项卡,点击某个学生的删除连接:点击删除按钮,你会看到在索引页面中指定的学生已经被删除。(稍后的教程中我们将介绍并发处理)确保数据库连接不是一直打开要确保数据库连接正确的关闭并释放所占用的资源,当你使用完数据库上下问候,需要将其销毁。这就是为什么脚手架代码在Student控制器类的最后部分提供了一个Dispose方法,如下面的代码:
protected override void Dispose(bool disposing)
if (disposing)
db.Dispose();
base.Dispose(disposing);
}控制器基类已经实现了IDisposeable接口,所以这段代码只是简单的重写了Dispose(bool)方法以显式地销毁上下文实例。处理事务默认情况下,实体框架隐式的实现事务处理。当你对多个表或行进行了更改后调用SaveChanges,实体框架会自动确保你的所有更改全部成功保存到数据库或全部保存失败。如果某些更新完成,之后发生了一个错误,那之前完成的更新将自动全部回滚。当你需要对事务的更多的控制权时&&比如您想要在一次事务中包含在实体框架之外的操作&&参见MSDN上的Working with Transactions。&总结您现在拥有一套针对Student实体完成的CRUD操作。你使用了MVC帮助器来生成数据字段的UI元素,关于帮助器的更多信息,参见 Rendering a Form Using HTML Helpers。在下一节教程中我们会给索引页添加排序和分页等更多的功能。作者信息&&Tom Dykstra - Tom Dykstra是微软Web平台及工具团队的高级程序员,作家。
[ASP教程][渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP MVC...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、..._推酷[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页 - ... 到目前为止,你已经实现了基本的CRUD和排序、筛选、分页及分组功能,下一节中...[ASP教程][渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...Code First using MVC 5 系列的翻译,这里是第十篇:为ASP MVC应用程序... 使用MVC 5的EF6 Code First入门系列:实现基本的CRUD功能 - 编程... 使用...MVC WEB安全——XSS攻击防御 - _DN - 云聚 [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能 - Bce 发布于
16:29:00 英文渣水平,大伙凑合着看吧...[ASP教程]实体框架 (EF) 入门 = 六、性能注意事项_郑少群个人...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的C...使用MVC 5的EF6 Code First入门系列:实现基本的CRUD功能作者:Bce 发布日期:...MVC5+EF6 入门完整教程五MVC5+EF6 入门完整教程五 - 新站长杂谈栏 - 落伍者 - Powered by ... 上篇文章介绍了EF实现CRUD及一些基本的Html Helpers... 完善一些功能 文章提纲 理论基础 UI改造详细步骤 ...高级模式 B Color Image Link Quote Code Smilies ...Visual Studio 2013的发布对ASP和实体框架的重大改进 - ...寻呼, $元数据, CRUD操作,在任何数据源和自定义...ASP的简单入门: ASP MVC5的入门教程. ... EF6新的连接跳回功能,使你能够注册一个执行策略来...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:建立一..._推酷[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...中增加Database.SetInitializer语句来实现同样的功能。...程序,在后面的教程中,您将学习如何执行基本的CRUD...MVC5+EF6 入门完整教程二 - 推酷 结合EF完成注册/登录的功能 以Table的CRUD为例子,展开讲解EF (code first方式) 借助bootstrap加入页面样式,补充其他功能,将前面的代码扩展成一个开发的基础框架...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页... 到目前为止,你已经实现了基本的CRUD和排序、筛选、分页及分组功能,下一节中...MVC中使用EF(二):实现基本的CRUD功能 - VC/MFCMVC中使用EF(2):实现基本的CRUD功能 MVC中使用EF(2):实现基本的CRUD功能 ...Framework有三种处理数据的方式: Database First, Model First, and Code First...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP..._博客园[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP MVC应用...或者数据更新覆盖的问题真的不是很重要,实现并发冲突的开销可能会大于它带来的...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:建立..._博客园[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...中增加Database.SetInitializer语句来实现同样的功能。...程序,在后面的教程中,您将学习如何执行基本的CRUD...MVC5+EF6 入门完整教程二-ASP-第七城市c# - Unity Bootstrapper (Unity.Mvc), Unity 3, MVC 5, EF6 ...(Unity.Mvc), Unity 3, MVC 5, EF6 Receiving ... IAssetService.cs (first param is the assetService... I forgot to add the UnityMvcActivator.cs code,...MVC5+EF6 入门完整教程五 - 推酷上篇文章介绍了EF实现CRUD及一些基本的Html Helpers.... 完善一些功能 文章提纲 理论基础 UI改造详细...的版本是 v3.3.0, 我们直接下载 Source code...使用MVC5的EF6 Code First入门 系列:MVC程序中实体框架的Code ...这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第五篇:MVC程序中实体框架的Code First迁移和...编程思想里面,何谓解耦? - 云聚把内在关联密切的功能/实现放在一个模块中,最小化暴露给外部的细节和依赖...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能......Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,...本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code ... [ASP教程][渣译文] 使用 MVC 5 的 EF6 Code First 入门系列:...andmand......的 EF6 Code First 入门 系列:实现基本的CRUD功能 - B..._博客园这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第二篇:实现基本的CRUD功能...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.N..._推酷[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP MVC应用... 在实体框架6版本中引入的功能使它在无需编写仓储代码的情况下来实现单元测试...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为A..._第七城市[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP MVC应用...要注意某些自定义功能呢只能使用fluent API来实现,但一般建议是仅选择这两者中之...MVC5 Entity Framework学习之实现基本的CRUD功能 - 推酷MVC5 Entity Framework学习之实现基本的CRUD功能...{ return new HttpStatusCodeResult(HttpStatusCode....(Include = &ID,LastName,FirstMidName,Enrollment...MVC5+EF6 入门完整教程二 - 好库文摘 结合EF完成注册/登录的功能 以Table的CRUD为例子,展开讲解EF (code first... ASP中使用JqGrid完整实现 (74) MVC5+EF6 入门完整教程二 (63) MVC5+...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页 ... 到目前为止,你已经实现了基本的CRUD和排序、筛选、分页及分组功能,下一节中...[ASP教程]ASP MVC 5 + EF 6 入门教程 Model和Entity ...[][渣译文] 使用 MVC 5 的EF6 Code First 入门 系列:... ASP MVC+EF框架+EasyUI实现权限管理系列(6)- EF... ...ASP MVC 5 –CRUD operations with Entity ...[ASP教程]MVC对集合筛选,不使用Where(),而使用FindAll()_郑...让Order类实现IDate接口。 using S using ...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...出色的 CRUD 服务配合简单易懂的 MVC 模型,...‘...Entity Framework - 随笔分类 - Bce - 博客园 这是微软官方教程Getting Started with Entity Framework 6 Code First using ...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能 ...MVC5+EF6 入门完整教程四 - MiroYuan - 博客园 Database First,Model First和Code First,我们采用... 理论基础 -- EF CRUD 针对之前创建的SysUser, ...通过定义接口确定数据访问类的功能需求, 接着实现该...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体...如果要测试连接恢复功能,您需要一种可以拦截实体...所以在本节中,我们将创建一个接口并实现它。 ...[渣译文] 使用 MVC 5 的 EF6 Code First 入门...MVC 5 的 EF6 Code First 入门 - Litt_J的专栏 - 博客频道 - CSDN...[渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:...中增加Database.SetInitializer语句来实现同样的功能。...程序,在后面的教程中,您将学习如何执行基本的CRUD...

我要回帖

更多关于 ef6 code first 的文章

 

随机推荐