代码改变世界

ALinq 入门学习(五)--删除修改数据

2010-05-13 18:29  贺臣  阅读(1877)  评论(5编辑  收藏  举报


1.简单的数据删除

删除数据和Linq to SQL 方式是一样的,都是先从数据库中取出改行数据然后再删除。也就是说对于对象操作室操作删除对象。下面是根据主键删除一行数据代码

ALinq 主键删除一行数据
 1 /// <summary>
 2         /// ALinq 的简单删除数据形式
 3         /// </summary>
 4         public void FunctionDelete()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(connectionString);
 7             TabRole role = context.TabRole.Single(r => r.Id == 14);
 8             context.TabRole.DeleteOnSubmit(role);
 9             context.SubmitChanges();
10         }

 

 

2. 级联操作删除数据

级联操作删除数据,就是如果我删除主键表中的一行数据,则我要同时删除外键表中对应的数据。这是为了保证数据的准确性和完整性。但是ALinq 并不是说删除主键表中的数据就能自动删除外键表中的数据。它必须先删除外键表中的数据然后删除主键表中的数据。当然这里说的主外键关系式一个相对而言的,在实际的数据库中并不一定有物理存在的主外键关系,因为ALinq 本事就是一个ORM框架,可以使用实体来代理数据库表中的关系。所以我们只需建立好实体之间的关系就能很方便的操作数据。同时在我们一般项目过程中,数据库是不会建立表和表之间的关联关系。下面是级联删除数据操作实例代码

ALinq 级联操作删除数据
 1 /// <summary>
 2         /// 级联删除
 3         /// </summary>
 4         /// <returns></returns>
 5         public void FunctionDeleteJion()
 6         {
 7             OA_DBDataContext context = new OA_DBDataContext(connectionString);
 8             TabRole role = context.TabRole.Single(r => r.Id == 1);
 9             var tabUsers = from u in context.TabUser where u.RoleId == 1 select u;
10             foreach (TabUser user in tabUsers)
11             {
12                 context.TabUser.DeleteOnSubmit(user);
13             }
14             context.TabRole.DeleteOnSubmit(role);
15             context.SubmitChanges();
16         }
17 

 

 

3. 级联操作删除部分数据

在项目过程中,我们需要删除外键表中的部分数据,这里也就表明不会删除主键表中的数据。这里的删除和上面的删除方式有一点不同,我们是根据主键表实体对象中的属性(外键表对象集合)对应关系移除数据对象.表述可能不是太清楚,代码比较明确。

ALinq 级联删除外键部分数据
 1 /// <summary>
 2         /// 删除外键的部分数据
 3         /// </summary>
 4         public void FunctionDeleteT()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(connectionString);
 7             TabRole role = context.TabRole.Single(r => r.Id == 1);
 8             TabUser user = role.TabUser.First();
 9             role.TabUser.Remove(user);
10             context.SubmitChanges();
11         }

 

这里不是直接删除对象,而是从集合中移除数据。刚才说到了,这些对象对应着数据的关系,因此我们移除对象中的数据然后反映到数据库中就可以删除对应的数据。

 

4. 简单修改数据

单纯的修改一行数据和删除一行数据是一样的,都是先从数据库中取出当行数据,并以对象形式删除反映到数据库。

ALinq 简单修改一行数据
 1  /// <summary>
 2         /// 修改数据
 3         /// </summary>
 4         public void FunctionUpdate()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(connectionString);
 7             TabRole role = context.TabRole.Single(r => r.Id == 1);
 8             role.RoleName = "dddddddd";
 9             context.SubmitChanges();
10         }

 

 

5. 同时修改多行数据

前面介绍过,对数据的修改都是想将数据从数据库中取出缓存到内存,然后统一提交到数据库。同时修改多行数据也是如此,先取出多行数据反应到内存,然后我们对数据对象进行修改,这些数据修改之后也是保存到内存中。只有到SubmitChanges()执行之后就会反应到数据库中。 

ALinq 同时修改多行数据
 1 /// <summary>
 2         /// 一次修改多条数据
 3         /// </summary>
 4         public void FunctionManeyUpdate()
 5         {
 6             OA_DBDataContext context = new OA_DBDataContext(connectionString);
 7             IList<TabUser> list = context.TabUser.Where(u => u.Id > 2).Select(u => u).ToList<TabUser>();
 8             foreach (TabUser usr in list)
 9             {
10                 usr.Ext1 = usr.Id.ToString() + usr.UserName;
11             }
12             context.SubmitChanges();
13         }

 

 

6.使用Attach() 关联一行数据修改

Attach() 方法也可以反应修改数据。 之前的删除数据和修改数据都是在DataContext下关联的。在某些情况下,我们修改或删除数据并不一定是在DataContext 的管理下,那这样的对象就不受DataContext控制,也就是我们所说的游离状态。如果我们需要对这些数据进行操作,我们就得让这些数据在DataContext 的管理下。下面的这个例子,先查询出一个对象,将这个对象值赋给另外一个不受DataContext管理的对象。使之不受DataContext的管理。在后续的过程中又要对这些数据进行修改,只是从新回到管制状态下。

ALinq Attach() 方法修改数据
 1 /// <summary>
 2         /// 使用Attach 方法来更新数据
 3         /// </summary>
 4         public void FunctionAttachUpdate()
 5         {
 6             TabRole role = null;
 7             using (OA_DBDataContext context1 = new OA_DBDataContext(connectionString))
 8             {
 9                 TabRole tempRole = context1.TabRole.Single(r => r.Id == 1);
10                 role = new TabRole()
11                 {
12                     Id = tempRole.Id,
13                     Ext1 = tempRole.Ext1,
14                     Ext2 = tempRole.Ext2,
15                     Ext3 = tempRole.Ext3,
16                     Ext4 = tempRole.Ext4,
17                     Ext5 = tempRole.Ext5,
18                     ISFobid = tempRole.ISFobid,
19                     Remark = tempRole.Remark,
20                     RoleName = tempRole.RoleName
21                 };
22             }
23 
24             using (OA_DBDataContext context2 = new OA_DBDataContext(connectionString))
25             {
26                 context2.TabRole.Attach(role);
27                 role.RoleName = role.RoleName + " attache";
28                 context2.SubmitChanges();
29             }
30         }

 

这里游离状态的role 对象 在Attache() 方法的作用下使之从新回到管制状态下,然后对数据的修改也会反映到数据中。 

 

7. 使用AttachAll() 关联多行数据修改

 AttachAll() 的用法和Attache() 的用法是一样的,只是操作数据行的多少问题,这里不再累述。看看这个方法使用的代码:

ALinq AttachAll() 修改多行数据
 1 /// <summary>
 2         /// 使用attacheAll 来更新数据
 3         /// </summary>
 4         public void FunctionAttachAllUpdate()
 5         {
 6             IList<TabUser> list = new List<TabUser>();
 7             using (OA_DBDataContext context1 = new OA_DBDataContext(connectionString))
 8             {
 9                 TabRole tempRole = context1.TabRole.Single(r => r.Id == 1);
10                 var tabUsers=tempRole.TabUser.Select(c=>c);
11                 foreach(TabUser user in tabUsers)
12                 {
13                     list.Add(new TabUser() { 
14                         Address=user.Address,
15                         Age=user.Age,
16                         Birthday=user.Birthday,
17                         CardID=user.CardID,
18                         Descript=user.Descript,
19                         Ext1=user.Ext1,
20                         Ext2=user.Ext2,
21                         Ext3=user.Ext3,
22                         Ext4=user.Ext4,
23                         Ext5=user.Ext5,
24                         ISFobid=user.ISFobid,
25                         IsMarried=user.IsMarried,
26                         PassWord=user.PassWord,
27                         Remark=user.Remark,
28                         Sex=user.Sex,
29                         RoleId=user.RoleId,
30                         UserName=user.UserName,
31                         Id=user.Id
32                     });
33                 }
34             }
35 
36             using (OA_DBDataContext context2 = new OA_DBDataContext(connectionString))
37             {
38                 context2.TabUser.AttachAll(list);
39                 foreach (TabUser user in list)
40                 {
41                     user.UserName = user.UserName + "  "+user.Id.ToString();
42                 }
43                 context2.SubmitChanges();
44             }
45         }

 

 


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms