Entity Framework4.0 (六) EF4的 增加、删除、更改
前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法。让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作。这样我们更容易把主要精力集中在业务逻辑上面,从而轻松、快捷、高扩展性地实现所需的业务功能。
好了,这次介绍EF4的增加、删除、更改。
========================================================
我们基于前面的EFDemo的示例,作进一步的修改:
1.增加Category:

using (NorthwindEntities context = new NorthwindEntities())
{
Category category = new Category();
category.CategoryName = cateName;
category.Description = desc;
context.Categories.AddObject(category);
context.SaveChanges();
}

代码解释:
第1行:new 出容器对象 context。对EF4的实体操作前,都要new出这个容器的,因为是这个容器管理着所有的EF实体对象。
第3行:new一个Category 的对象category。每一个实体类都有一个空参数的构造方法用于产生对象。同时也有一个工厂方法可用于产生对象(如,Category类就有一个CreateCategory(),只是这个工厂方法是带参数的。参数列表就是对应的数据库表中不能为空的字段列表。如下:)

public static Category CreateCategory(global::System.Int32 categoryID, global::System.String categoryName) { Category category = new Category(); category.CategoryID = categoryID; category.CategoryName = categoryName; return category; }

但是,由于CategoryID在数据库中是自增长的,我们无法手动指定,如果CategoryID不是由数据库指定的,我们就可以:这样写

using (NorthwindEntities context = new NorthwindEntities()) { var category = Category.CreateCategory(, cateName); context.AddToCategories(category); context.SaveChanges(); }

第4,5行:对其属性进行赋值。
第6行:保存到容器的Categories集合中。
第7行:将容器中数据同步后保存到数据库中。 上面只是简单的单个实体的增加。但,很多情况是实体间是由关联关系的。所以增加实体的时候,也要考虑它所关联的实体,代码如下:

using (NorthwindEntities context = new NorthwindEntities())
{
// 创建类别对象,你也可从数据库取出来一个已经存在的类别.如ID==123.
// var category = context.Categories.Where(c => c.CategoryID == 123).First(); Category category = new Category();
category.CategoryName = "Bevera";
category.Description = "It's beautiful"; // 创建一个产品对象。 Product product = new Product();
product.ProductName = "Aniseeup";
product.UnitPrice = ; // 把产品添加到类别的产品集合中,这样容器就会自动把该类别的CategoryID号赋值给该产品的CategoryID这个外键。
// 从而把该产品与该类别联系起来。 category.Products.Add(product); context.Categories.AddObject(category);
context.SaveChanges();
}

注意: 把产品添加到类别的产品集合中,这样容器就会自动把该类别的CategoryID号赋值给该产品的CategoryID这个外键。我们不必去处理外键,只用通过导航属性(如,Category类中的Products这个导航属性)就可以把该产品与该类别联系起来。
2.修改:

using (NorthwindEntities context = new NorthwindEntities()) { var product = context.Products.First(p => p.ProductID == productID); //var product = context.Products.Where(p => p.ProductID == productID).First(); product.ProductName = productName; context.SaveChanges(); MessageBox.Show("update succeed"); }

代码解释:
第3行:p => p.ProductID == productID ,后面的这个productID是一个变量,表示我们将要更新的那个产品的ID号。第3行和第4行其实是一模一样的,只是写法不同而已。
第5行:product.ProductName = productName;后面这个productName是一个变量,代表是产品的新名字。
第7行:保存数据到数据库中。
修改的时候,我们也可以利用导航属性。如:我们把某个产品增加到另外一个Category的Products集合中,从而修改这个产品所在的类别。在数据库中该产品所对应的CategoryID就会被修改掉。对于开发人员来说,只是以对象的方式在处理实体象集合与实体之间的关系。
3.删除:

using (NorthwindEntities context = new NorthwindEntities())
{
var category = context.Categories.Where(c => c.CategoryID == ).First();
context.DeleteObject(category);
context.SaveChanges();
}

总结:1. 增加的时候,第一步需要new出来一个对象,如果该对象有外键,把它添加到相应的集合中。如果不添加到任何一个集合中,则外键为null。
2. 删除、修改的第一步都是要筛选出要处理的对象。
3. 前面我们说过EF4的关联有独立关联与外键关联。外键关联是在(重数为“多端”的)实体中保持一个专门的属性对应(重数为“一端”的)实体的ID号。就是在“Product”实体中要有一个外键属性“CategoryID” 同时要有一个导航属性category。而独立关联是在“Product”实体中要没有一个外键属性“CategoryID” ,只有一个导航属性category。前面示例我们已经看到:我们并不直接操作CategoryID,而是由容器context代劳的。所以,两种关联的差别只是容器context作saveChange()时,有些区别。对使用EF4的人来说,几乎没什么影响。当然,多一个外键属性的话,我们可以直接编程操作该外键属性,也是比较灵活的。
在我们开发人员使用EF4进行增删改时,并不关心 在保存时:
SaveChanges()函数有一处重载的方法 :
SaveChanges(SaveOptions)
SaveOptions 这个枚举可以传三个参数:
- AcceptAllChangesAfterSave:就是把数据保存到数据库以后重置实体的状态。
- DetectChangesBeforeSave:就是把数据保存到数据库之前同步实体的状态。
- None:就是把数据保存到数据库之前,不同步实体的状态;把数据保存到数据库以后,也不重置实体的状态。
调用SaveChanges()就等同于SaveChanges(SaveOptions.AcceptAllChangesAfterSave | SaveOptions.DetectChangesBeforeSave);
对象状态:我们的每个新生成的查询返回的实体,都被保存在Context的容器中的缓存中,则ObjectStateManager 负责管理它们的状态。每一个实体只保留一个实例,每次查询只是往缓存增加之前未曾存在过的实体。对于已经存在的实体,只需要从数据库取数据并将它们的值进行合并。为了区别缓存中某个实体的前后变化,就需要专门来管理实体的状态。从数据源取到的数据与缓存中的数据进行合并时,是根据设置的合并策略去合并。先说这么多,关于合并策略的更细节的内容,以后再深入。呵呵,怕累着大家咯!!
---------------------------------------------------
来自http://www.cnblogs.com/marksun/archive/2011/12/20/2295319.html
Entity Framework4.0 (六) EF4的 增加、删除、更改的更多相关文章
- [转]Entity Framework4.0 (七) EF4的存储过程
本文转自:http://www.cnblogs.com/marksun/archive/2011/12/21/2296500.html 前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单 ...
- Entity Framework4.0 (七) EF4的存储过程
前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...
- Entity Framework4.0 (一)概述(EF4 的Database First方法)
转自:http://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html Entity Framework4.0(以后简称:EF4),是Mic ...
- AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层
AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层 AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层我理解的图层的作用大概是把 ...
- Nodejs之MEAN栈开发(九)---- 用户评论的增加/删除/修改
由于工作中做实时通信的项目,需要用到Nodejs做通讯转接功能,刚开始接触,很多都不懂,于是我和同事就准备去学习nodejs,结合nodejs之MEAN栈实战书籍<Getting.MEAN.wi ...
- 转: KindEditor 图片空间文件增加删除文件、文件夹功能(ASP语言环境)
KindEditor 图片上传功能中集成的图片空间文件管理插件可以对已上传图片进行管理,十分便捷,只是没有图片删除功能,仔细研读xieliang分享的经验后,自己动手改造了一下,顺便分享给有同样需求的 ...
- 在Javascript操作JSON对象,增加 删除 修改
在Javascript操作JSON对象,增加删除修改全有的,详情见代码 <script type="text/javascript"> var jsonObj2 = { ...
- VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)
一,开场白: 在微软的实体数据模型中存在四种查询方式:SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明 ...
- UITableView 编辑模式(增加-删除-移动---自定义左滑 title)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
随机推荐
- ReactNative学习-ListView
ListView相对于View的优点就在于可以不用一下子就把数据加载完,而是滑动着加载着数据,可以缓解数据加载,避免软件卡死. 官方文档:https://facebook.github.io/reac ...
- P2022 有趣的数
P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...
- 二维码zxing源码分析(五)精简代码
由于工作的需要,我并不是需要二维码扫描的所有的功能,我只是需要扫一扫,并显示出来图片和url就行,于是我们就要精简代码了,源码已经分析完了,精简起来就方便多了,源码分析请看 二维码zxing源码分析( ...
- Part 95 to 96 Deadlock in a multithreaded program
Part 95 Deadlock in a multithreaded program class Program { static void Main(string[] args) { Cons ...
- openquery链表删除时报错 “数据提供程序或其他服务返回 E_FAIL 状态”
DELETE OPENQUERY (VERYEAST_COMPANY_MYSQL_CONN, 'SELECT * FROM company ') WHERE c_userid in(select c_ ...
- PictureBox控件鼠标进入的手形改变和提示
PictureBox控件载入了图片后,如果要设置其为链接作用的功能,一般需要当鼠标移动到其上时鼠标自动变为手形以提示用户此时可以点击,如果图形无法方便辨识链接的具体功能,最好此时给与一定提示. 1.鼠 ...
- GNU Binutils工具
参考<程序员的自我修养---连接.装载与库> 以下内容转贴自 http://www.cnblogs.com/xuxm2007/archive/2013/02/21/2920890.html ...
- 小米pad MI PAD 开发者选项、USB调试开启方式
设置->关于平板->在MIUI版本一行连续点击7次. 之后就出现了开发者选项.可以开启USB调试等. 你能想到吗……??
- GCD Block
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- 《samba服务搭建》RHEL6
Samba服务不仅可以实现linux和win之间的文件共享,也可以实现linux和linux之间的共享,samba的用户只限服务端本地用户使用. 本文的环境是selinux开启的情况下配置 Samba ...