前面介绍了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的 增加、删除、更改的更多相关文章

  1. [转]Entity Framework4.0 (七) EF4的存储过程

    本文转自:http://www.cnblogs.com/marksun/archive/2011/12/21/2296500.html 前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单 ...

  2. Entity Framework4.0 (七) EF4的存储过程

    前面了解了EF4的CRUD的操作,你会发现EF4使用起来比较简单的.呵呵,之前我们使用数据库的时候,有时会使用存储过程代替在代码中直接使用SQL语句. 使用存储过程的好处: 提高效率:因为存储过程是经 ...

  3. Entity Framework4.0 (一)概述(EF4 的Database First方法)

    转自:http://www.cnblogs.com/marksun/archive/2011/12/15/2289582.html Entity Framework4.0(以后简称:EF4),是Mic ...

  4. AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层

    AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层 AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层我理解的图层的作用大概是把 ...

  5. Nodejs之MEAN栈开发(九)---- 用户评论的增加/删除/修改

    由于工作中做实时通信的项目,需要用到Nodejs做通讯转接功能,刚开始接触,很多都不懂,于是我和同事就准备去学习nodejs,结合nodejs之MEAN栈实战书籍<Getting.MEAN.wi ...

  6. 转: KindEditor 图片空间文件增加删除文件、文件夹功能(ASP语言环境)

    KindEditor 图片上传功能中集成的图片空间文件管理插件可以对已上传图片进行管理,十分便捷,只是没有图片删除功能,仔细研读xieliang分享的经验后,自己动手改造了一下,顺便分享给有同样需求的 ...

  7. 在Javascript操作JSON对象,增加 删除 修改

    在Javascript操作JSON对象,增加删除修改全有的,详情见代码 <script type="text/javascript"> var jsonObj2 = { ...

  8. VS2010+Oracle11+Entity Framework4.1环境搭建及常见问题(转)

    一,开场白: 在微软的实体数据模型中存在四种查询方式:SQL字符串:Linq:Linq to SQL:Linq to Entity(ESQL) 对于Linq SQL目前微软虽然仍在支持,但微软已经声明 ...

  9. UITableView 编辑模式(增加-删除-移动---自定义左滑 title)

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

随机推荐

  1. JSON解析总结2

    使用json-lib-2.4-jdk15.jar JSON工具类: import java.util.List; import net.sf.json.JSONArray; import net.sf ...

  2. How to Use Rsync to Sync New or Changed/Modified Files in Linux

    As a system administrator or Linux power user, you may have probably come across or even on several ...

  3. 【CSS3】---嵌入字体@font-face

    @font-face能够加载服务器端的字体文件,让浏览器端可以显示用户电脑里没有安装的字体. 语法: @font-face { font-family : 字体名称; src : 字体文件在服务器上的 ...

  4. Oracle中的内置函数在sql中的转换整理

    程序里面经常会即支持Oracle数据库,又支持sql数据库.而有些Oracle内置函数用的比较多,但在sql中语法有些不同,我做了些整理,希望可以帮助大家.... 1.oracle中的内置函数:ora ...

  5. AjaxPro.2使用小结

    这是我最近没事的时候研究的东东,使用AjaxPro.2.dll,从前台调用后台Ajax方法,希望对各位亲有帮助哦.. 1.首先将AjaxPro.2.dll从网上下载下来,打开VS项目,点击项目,右键- ...

  6. Part 67 to 70 Talking about method parameters in C#

    Part 67 Optional parameters in c# Part 68  Making method parameters optional using method overloadin ...

  7. Sass之初识

    Sass is the most mature, stable, and powerful professional grade CSS extension language in the world ...

  8. SQL Server 事务处理 回滚事务

    --创建表: GO CREATE TABLE [dbo].[tb1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] N ...

  9. 苹果系统开发中的混合编程(1):Objective-C和C++的相互调用

    首先是OC调用C++的代码.   创建一个Objective-C的项目,并创建c++文件MyCppFile.hpp和MyCppFile.cpp.   把要调用Cpp代码的文件名改成mm后缀名,项目代码 ...

  10. Swift数据类型及数据类型转换

    整型  Swift 提供 8.16.32.64 位形式的有符号及无符号整数.这些整数类型遵循 C 语言的命名规 约,如 8 位无符号整数的类型为 UInt8,32 位 有符号整数的类型为 Int32 ...