ALinq 入门学习(五)--插入数据
2010-05-07 15:22 贺臣 阅读(2378) 评论(11) 编辑 收藏 举报Linq to SQL 的插入相对于ADO.NEt 来说是少了很多工作。ALinq 的插入和Linq to SQL 也非常相似。这几篇文章可能对于有些人来说是很肤浅的,如果懂Linq to SQL 的同仁来说,这些东西就是积分中的事情,因为这些东西基本一样,只需要注意一些小的细节即可。声明一次,如果有人觉得这文章很垃圾,请不要恶言相对,不留言即可。谢谢!!。希望博客园的还是以技术交流为主,不要有过多的口舌之争!!
1. 插入单行数据
数据库表在实体设计器中会生成对应的实体对象,我们可以通过这些对象来操作代理操作数据库。
如果需要插入一行数据:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提交到数据库 , InsertOnSubmit()方法先将数据写入内存中,然后有SubmitChanges()统一提交持久化到数据库中。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 /// 插入单个实体对象
3 /// </summary>
4 public void FunctionInsEntity()
5 {
6 OA_DBDataContext context = new OA_DBDataContext(connectionString);
7 TabRole role = new TabRole();
8 role.Ext1 = "";
9 role.Ext2 = "";
10 role.Ext3 = "";
11 role.Ext4 = "";
12 role.Ext5 = "";
13 role.ISFobid = 0;
14 role.Remark = "查看权限";
15 role.RoleName = "查看权限";
16 context.TabRole.InsertOnSubmit(role);
17
18 //context.GetTable<TabRole>().InsertOnSubmit(role);
19 context.SubmitChanges();
20 }
上面代码中有一行被注释了的代码,这句代码也可以插入一个实体对象。当然如果两个同时使用,只能提交一行数据到数据库中。
2. 插入多行数据
有时候我们插入数据不仅仅是插入一行数据,如果在对同一个表插入数据的时候有多行数据插入,我们每连接一次数据库然后插入一行数据,这样对于性能是一个极大的损耗,上面的提到过了, InsertOnSubmit() 可以先将数据存储到内存中 然后统一提交到数据。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 /// 插入多个实体对象
3 /// </summary>
4 public void FunctionInsmanyEntity()
5 {
6 OA_DBDataContext context = new OA_DBDataContext(connectionString);
7 IList<TabRole> list = new List<TabRole>();
8 for (int i = 0; i < 5; i++)
9 {
10 TabRole role = new TabRole();
11 role.Ext1 = (i + 1).ToString();
12 role.Ext2 = (i + 2).ToString();
13 role.Ext3 = (i + 3).ToString();
14 role.Ext4 = (i + 4).ToString();
15 role.Ext5 = (i + 5).ToString();
16 role.ISFobid = i % 2 == 0 ? 0 : 1;
17 role.Remark = "查看权限" + i;
18 role.RoleName = "查看权限" + i;
19 list.Add(role);
20 }
21 context.TabRole.InsertAllOnSubmit(list);
22 context.SubmitChanges();
23 }
这个方法中 创建了5个对象,使用InsertAllOnSubmit() 方法将5个对象同时保存到内存中,这个方式和上面InsertOnSubmit()方法作用相同,只是保存的是一个集合。最后也是使用SubmitChanges()提交到数据库。
3.级联插入数据
在数据库中存在两个主外键关系的表,我们使用实体设计器建立实体关系,并生产相应的实体对象。我们需要的操作是,当插入子表数据的时候,同时指定主键表的实体,而这个实体本身也是要新建的。也就是说要先生成一个逐渐表ID,然后再插入到子表中(外见表).这个操作在Linq to SQL 中是可以行的,但是在ALinq 中好像不行。这个问题可能是我本人还没有了解清楚,不过这里先介绍一下ALinq 中的用法,之后我去找ALinq 的作者了解一下情况然后补充。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 /// 插入有关联关系的实体
3 /// </summary>
4 public void FunctionInsRelaEntity()
5 {
6 OA_DBDataContext context = new OA_DBDataContext(connectionString);
7 TabRole role = new TabRole();
8 role.Ext1 = "";
9 role.Ext2 = "";
10 role.Ext3 = "";
11 role.Ext4 = "";
12 role.Ext5 = "";
13 role.ISFobid = 0;
14 role.Remark = "级联关系";
15 role.RoleName = "级联关系";
16
17 TabUser user = new TabUser
18 {
19 Address = "上海",
20 Age = 23,
21 Birthday = DateTime.Now,
22 CardID = "421022195905303919",
23 Descript = "",
24 Ext1 = "",
25 Ext2 = "",
26 Ext3 = "",
27 Ext4 = "",
28 Ext5 = "",
29 ISFobid = 0,
30 RoleId = 1,
31 IsMarried = 0,
32 PassWord = "sdfsdf",
33 Remark = "备注",
34 Sex = 0,
35 TabRole = role,
36 UserName = "sdfsdf"
37 };
38 context.TabUser.InsertOnSubmit(user);
39 context.SubmitChanges();
40 }
41
4.动态操作数据
在java Hibernate 中有个方法很不错,那就是当数据存在主键值对应的数据时就修改,如果没有就增加一行数据。Linq to SQL 也支持这个操作,但是ALinq 又好像不支持,说到这里感觉ALinq 还是有很多弊端的,不过这些都不影响我们使用,一般使用这种操作都很少的,我们可以使用其他的方式来替代。下面看看Linq to SQL 中的动态修改数据方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
2 /// 重写数据
3 /// </summary>
4 public void FunctionOverrideData()
5 {
6 OA_DBDataContext context = new OA_DBDataContext(connectionString);
7 TabRole role = new TabRole
8 {
9 Ext1 = "ddd",
10 Ext2 = "ddd",
11 Ext3 = "ddd",
12 Ext4 = "ddd",
13 Ext5 = "ddd",
14 ISFobid = 0,
15 Remark = "级联关系",
16 RoleName = "级联关系",
17 Id = 2
18 };
19 context.TabRole.InsertOnSubmit(role);
20 context.SubmitChanges();
21 }