http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6705|回复: 6

[其他] Entity Framework进行增加,删除和修改

[复制链接]
发表于 2013-5-13 16:53:12 | 显示全部楼层 |阅读模式
Entity Framework  在dataGridview 里面进行增加删除修改
刚学习 Entity Framework  ,但是没找到这方面的资料


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-5-13 17:04:38 | 显示全部楼层

增加、删除、更改。

========================================================

我们基于前面的EFDemo的示例,作进一步的修改:

1.增加Category:

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

代码解释:

第1行:new 出容器对象 context。对EF4的实体操作前,都要new出这个容器的,因为是这个容器管理着所有的EF实体对象。

第3行:new一个Category 的对象category。每一个实体类都有一个空参数的构造方法用于产生对象。同时也有一个工厂方法可用于产生对象(如,Category类就有一个CreateCategory(),只是这个工厂方法是带参数的。参数列表就是对应的数据库表中不能为空的字段列表。如下:)

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

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

[code=csharp]using (NorthwindEntities context = new NorthwindEntities())
                {
                    var category = Category.CreateCategory(1111, cateName);
                    context.AddToCategories(category);
                    context.SaveChanges();
                }[/code]

第4,5行:对其属性进行赋值。

第6行:保存到容器的Categories集合中。

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

[code=csharp]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 = 12;

                 // 把产品添加到类别的产品集合中,这样容器就会自动把该类别的CategoryID号赋值给该产品的CategoryID这个外键。
// 从而把该产品与该类别联系起来。
                 category.Products.Add(product);

                 context.Categories.AddObject(category);
                 context.SaveChanges();
             }[/code]

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

2.修改:

[code=csharp]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");
                 }[/code]

代码解释:

第3行:p => p.ProductID == productID ,后面的这个productID是一个变量,表示我们将要更新的那个产品的ID号。第3行和第4行其实是一模一样的,只是写法不同而已。

第5行:product.ProductName = productName;后面这个productName是一个变量,代表是产品的新名字。

第7行:保存数据到数据库中。

修改的时候,我们也可以利用导航属性。如:我们把某个产品增加到另外一个Category的Products集合中,从而修改这个产品所在的类别。在数据库中该产品所对应的CategoryID就会被修改掉。对于开发人员来说,只是以对象的方式在处理实体象集合与实体之间的关系。

3.删除:

[code=csharp]using (NorthwindEntities context = new NorthwindEntities())
             {
                 var category = context.Categories.Where(c => c.CategoryID == 1).First();
                 context.DeleteObject(category);
                 context.SaveChanges();
             }[/code]

总结: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 负责管理它们的状态。每一个实体只保留一个实例,每次查询只是往缓存增加之前未曾存在过的实体。对于已经存在的实体,只需要从数据库取数据并将它们的值进行合并。为了区别缓存中某个实体的前后变化,就需要专门来管理实体的状态。从数据源取到的数据与缓存中的数据进行合并时,是根据设置的合并策略去合并。先说这么多,关于合并策略的更细节的内容,以后再深入。呵呵,怕累着大家咯!!



发表于 2013-5-13 17:06:00 | 显示全部楼层
直接把上面方法放到GridView相应的方法里就行了
 楼主| 发表于 2013-5-13 17:32:59 | 显示全部楼层
   是直接在dataGridview里面进行操作,就是不知道怎么获取dataGridview增加行的值
发表于 2013-5-13 17:38:12 | 显示全部楼层
JackFamily 发表于 2013-5-13 17:32
是直接在dataGridview里面进行操作,就是不知道怎么获取dataGridview增加行的值

那你这应该是不会怎么做DataGridView的增删改查吧,而与EF无关。你安这个思路找找资料吧
 楼主| 发表于 2013-5-14 09:05:33 | 显示全部楼层
非常感谢你帮了我的大忙,真的太感谢你啦!
我 自己在找找资料
发表于 2013-5-14 09:34:28 | 显示全部楼层
现在没时间看,先留个记号,回头细细品味!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-25 14:10

© 2014-2021

快速回复 返回顶部 返回列表