ADO.NET Entity Framework 深入分析, Part 5
前面的Part 1-4的文章,介绍了Entity Data Model、Entity SQL、ObjectQuery、EntityCommand、LINQ to Entities等等及其代码演示。Part 4主要演示如何通过相关技术或Debug工具,如SQL Server Profiler、ToTraceString 方法、eSqlBlast 工具、LINQPad工具等等,来查看生成的T-SQL脚本。本篇文章Part 5 演示如何新增、更新和删除数据实体,并相应更新数据库。
ADO.NET Entity Framework 系列文章由EntLib.com 开源论坛、小组翻译、编写。欢迎交流、分享。
本系列文章前面部分链接:
Entity Data Model (EDM) 深入分析, Part 1
Entity Data Model (EDM) 深入分析, Part 2
Entity Data Model (EDM) 深入分析, Part 3
ADO.NET Entity Framework 深入分析, Part 4 (提供示例程序下载)
增加、更新和删除实体
将实体的更新操作应用到数据库很方便。对象服务(Object Services)将记录所有对实体对象的改变,并产生和执行相应的T-SQL语句,对数据库实施插入、更新和删除操作。
通过调用ObjectContext的SaveChanges() 方法,来实现对数据库的更新,这与LINQ to SQL 的DataContext的SubmitChanges() 方法比较相似。
更新或修改实体
NorthwindEntities context = new NorthwindEntities();
Employee firstEmployee = context.Employees.First(e => e.EmployeeID == 1);
if (firstEmployee != null)
{
firstEmployee.City = "San Francisco";
firstEmployee.Notes = "New notes for employee 1";
int affected = context.SaveChanges();
}
1) 检索一个Employee
LINQ to Entities 中,你可以使用扩展方法First(),因为SingleOrDefault() 方法将抛出NotSupportedException 异常(The 'Single' operator is not supported by LINQ to Entities. Consider using 'First' instead)。
2) 改变实体的一些属性
3) 调用ObjectContext 的SaveChanges() 方法,该方法将返回增加、修改或删除的实体对象的数量。
增加一个实体对象
Employee newEmployee = new Employee();
newEmployee.FirstName = "Jan";
newEmployee.LastName = "Jansen";
context.AddToEmployees(newEmployee);
context.SaveChanges();
1) 创建一个新的Employee 对象,并设置属性。
创建实体类之后,每一个生成的类都有一个静态的创建工厂方法。因此,你也可以使用CreateEmployee() 方法实例化一个Employee 对象和非空的属性。
如果细心一点,你将注意到EmployeeID 也是一个必须的字段。当然,这不是完全真实的,因为这是一个自增长的字段,由SQL Server 数据库来填充。在LINQ to SQL中,每一个属性成员有Auto Generated选项。Entity Framework 则没有这些,可能是因为它设计用来支持所有的数据库,可能一些数据库不支持AutoIncrement 数据类型,因此仅仅传递一个虚值。
Employee newEmployee = Employee.CreateEmployee(0, "Jansen", "Jan");
2) 调用ObjectContext对象的AddToEmployees() 方法。这与LINQ to SQL不一样,LINQ to SQL使用 Employees集合的InsertOnSubmit() 方法。在Entity Framework中,每一个EntityType自动生成指定的AddTo 方法。
你也可以使用对象上下文(Object Context) 的AddObject() 方法,第一个参数是Entity Set的名称,我个人喜好使用AddTo 方法。
context.AddObject("Employees", newEmployee);
3) 调用Object Context 的SaveChanges() 方法。
增加实体及其关联实体
Category newCategory = new Category();
newCategory.CategoryName = "Software";
newCategory.Description = "Software products";
newCategory.Products.Add(new Product() { ProductName = "Microsoft Visual Studio 2008" });
newCategory.Products.Add(new Product() { ProductName = "Microsoft Office 2007" });
context.AddToCategories(newCategory);
context.SaveChanges();
1) 创建一个新的Category 对象并设置属性。
2) 当你创建的实体通过Navigation 属性关联到另一个实体时,你可以调用集合Add() 方法。创建2个新的Product对象,并添加这2个对象到Category的Products集合。
3) 调用Object Context的AddToCategories() 方法。
4) 调用Object Context 的SaveChanges() 方法。
将执行如下3条T-SQL脚本:
exec sp_executesql N'insert [dbo].[Categories]([CategoryName], [Description], [Picture])
values (@0, @1, null)
select [CategoryID]
from [dbo].[Categories]
where @@ROWCOUNT > 0 and [CategoryID] = scope_identity()',N'@0 nvarchar(8),@1 nvarchar(17)',@0=N'Software',@1=N'Software products'
exec sp_executesql N'insert [dbo].[Products]([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice],
[UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued])
values (@0, null, @1, null, null, null, null, null, @2)
select [ProductID]
from [dbo].[Products]
where @@ROWCOUNT > 0 and [ProductID] = scope_identity()',N'@0 nvarchar(28),@1 int,@2 bit',@0=N'Microsoft Visual Studio 2008',@1=12,@2=0
exec sp_executesql N'insert [dbo].[Products]([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice],
[UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued])
values (@0, null, @1, null, null, null, null, null, @2)
select [ProductID]
from [dbo].[Products]
where @@ROWCOUNT > 0 and [ProductID] = scope_identity()',N'@0 nvarchar(21),@1 int,@2 bit',@0=N'Microsoft Office 2007',@1=12,@2=0
删除一个实体对象
Category cat = context.Categories.First(c => c.CategoryName == "Software");
context.DeleteObject(cat);
context.SaveChanges();
1) 检索一个Category 对象。
2) 调用Object Context 的DeleteObject() 的方法,并传入Category 对象。编写一个重载的方法,仅需要一个EntityKey,这也是可行的。
3) 调用Object Context 的SaveChanges() 方法。
在默认的Northwind 数据库,上述示例将抛出一个异常:"The DELETE statement conflicted with the REFERENCE constraint "FK_Products_Categories". The conflict occurred in database "Northwind", table "dbo.Products", column "CategoryID". The statement has been terminated."
如果你想删除Software目录和它的产品,你需要修改SQL Server数据库中FK_Products_Categories 外键的Delete Rule,并设置为Cascade。

本文由EntLib.com (http://blog.EntLib.com ) 开源博客、论坛小组翻译、编写。

转载于:https://www.cnblogs.com/entlibforum/archive/2008/11/03/1325169.html

ADO.NET Entity Framework 深入分析, Part 5相关推荐

  1. [导入]ADO.NET Entity Framework 深入分析, Part 6 – 处理并发(Concurrency Handling)

    摘要: ADO.NET Entity Framework 深入分析, Part 6 – 处理并发(Concurrency Handling)前面的Part 1-4的文章,介绍了Entity Data ...

  2. ADO.NET Entity Framework 学习(1) [ZT]

    前一段时间园子里有很多文章介绍分析了Linq To SQL,它可以说是一个简单实现的ORM,是微软针对数据和对象的阻抗不平衡的问题.C# 3.0推出一些新的特性,比如Extension Method, ...

  3. ADO.NET Entity Framework 简介

    一直对EF都是一知半解的,没有系统的了解过EF有什么样的功能,有什么具体的好处.在接下来的文章中会详细介绍EF.以下是参考MSDN上的文章,翻译并加以自己的理解得出的. ADO.NET Entity  ...

  4. 一处 ADO.NET Entity Framework 的逻辑BUG

    这几天开始接触ADO.NET Entity Framework,突然发现一处奇怪的BUG. 首先来看这样一个目录结构: 我将EDM模型存入了一个名为"A"的目录中,然后编辑模型,设 ...

  5. 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...

  6. ADO.NET Entity Framework Beta2(五)/快速入门(实体框架)

    This quickstart illustrates a series of tasks that support the topics in Getting Started with the En ...

  7. ADO.NET Entity Framework 基本概述

    时间过得很快转眼间VS已经2010版了,在4月12日将会正式发布VS 2010 ADOEF 做为.Net 4.0 中被微软推荐的ORM框架,相比.Net 3.5 sp1 已经得到了进一步的增强,使用它 ...

  8. ADO.NET Entity Framework 入门示例向导(附Demo程序下载)

    ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...

  9. SQLite的ADO.NET Provider支持ADO.NET Entity Framework

    Ado.net 官方博客 http://blogs.msdn.com/adonet/archive/2008/09/06/sqlite-s-ado-net-provider-supports-the- ...

最新文章

  1. idea创建mybatis的config.xml和mapper.xml方法
  2. Android跨进程通信二——AIDL
  3. Struts2之异常机制
  4. jetson nano 在opencv拉流的视频上显示中文汉字(含c++完整源码)
  5. 护航敏捷开发和运维 BCS2020举办DevSecOps论坛
  6. 基于SpringBoot的社区物业管理系统(设计与实现详解)
  7. QQ小游戏 微信小游戏 即时通信 IM 删除会话 deleteConversation sdk
  8. vue的Des加密解密
  9. 开关电源—Buck电路原理及其仿真
  10. 电脑如何分盘win10_Win10电脑如何刻录光盘?利用win10自带刻录工具来刻录DVD光盘教程...
  11. Windows 技术篇-修改hosts添加域名解析实例演示,设置域名指定ip方法
  12. Ubuntu主机合盖子不休眠
  13. 【uniapp】icon图标的使用
  14. yolov2 损失函数_深度学习计算机视觉之YOLO,YOLOv2和YOLOv3算法(超详细解析)
  15. 数码相机摄影修复技术DxO PureRAW中文
  16. 一行代码解决蓝奏云不能访问的问题
  17. 关于分布式事务 两阶段提交 一阶段提交 Best Efforts 1PC模式和事务补偿机制的研究
  18. 当今情势下,如何通过自媒体平台轻松赚钱
  19. 使用你们的AirDisk产品会不会泄露文件给你们,会不会将文件数据传送到你们服务器?
  20. 动力节点SpringBoot笔记整理

热门文章

  1. 查看sqlserver版本
  2. Type_C工作原理
  3. 2.2.1 MySQL基本功能与参数文件管理
  4. java错误页面显示错误信息_Struts2在JSP页面中显示错误信息和提示信息的方法
  5. 限制tomcat带宽_必看的Tomcat性能优化
  6. write up社工进阶
  7. 拒绝卡顿,揭秘盒马鲜生 Android 短视频秒播优化方案
  8. 如何利用DataWorks OpenAPI实现圈人?
  9. 基于Serverless的云原生转型实践
  10. Knative 化繁为简之道:应用部署与访问