前言
最近接连遇到几个朋友问我同一个问题,就是关于.NET平台上ORM框架的选择。我想在这个讲求效率的时代,谁也不想手写SQL或存储过程去访问数据库了。大家都知道,在Java平台上,ORM这一块基本是Hibernate的天下。当然,相对轻量级的iBatis也有不错的表现。 i. 它是微软自己的产品,和.NET平台有着天生的适应性。如果你使用.NET Framework3.5和VS2008开发环境,它本身就集成在里面了,同时VS2008对于Linq to Sql给予了诸多方便的支持。使用它,你不仅在开发和部署时不用考虑第三方库,更可以尽情享受VS2008带来的种种方便。 有这么好的理由,我真想不通为什么那么多人不愿去选择它。我想来想去,也许有两个重要原因,一是把LINQ和Linq to Sql混为一谈了,二是受前段时间“LINQ已死”的误导,觉得微软已经抛弃Linq to Sql了。关于这两点,我就不细说了,简略澄清一下: 好的,上面废话说了不少,下面正式开始吧。本文不是一篇关于Linq to Sql的大百科,写本文的目的,是引导大家快速上手Linq to Sql,所以不可能面面俱到去讲解Linq to Sql。不过根据80-20定律,学会了本文的内容,基本就可以应付80%的工作了。另外,延续我一贯的风格,本文将通过案例的方式帮大家上手Linq to Sql。案例是一个“公告发布程序”。下面我们开始! Step1:建立数据库 |
图1、数据表结构 其中Category和Bulletin存在一个一对多的关联,表示一个分类下可以有多条公告。 Step2:建立LINQ to SQL Classes文件 |
Step3:根据数据库表自动生成代码 |
如图3所示,在Server name中填入SQL Server数据库服务的名字,如果使用的是SQL Server Express 2005,服务名一般是“计算机名\SQLEXPRESS”的格式,然后在“Select or enter a database name”中选择MyBulletin,单击“OK”,就连上我们所需的数据库了。 这时,展开这个连接下的Tables节点,应该能看到Category和Bulletin两个表,选中两个表,将它们拖到DataClasses.dbml的设计区,就会看到如图4所示的样子。 |
然后,按Ctrl+S保存,OK!ORM构建完了! 没有骗你,所有需要的代码已经生成完成,现在可以使用它们操作MyBulletin数据库了。不要怀疑,Linq to Sql使用起来就是这么轻松加愉快,不需要写一行代码,也不需要写一个XML字符,ORM就构建完了! 我知道你没看到生成的东西可能不太放心,那么你可以在Solution Explorer里展开DataClasses.dbml节点,看到里面的DataClasses.designer.cs文件没,打开它,里面就是刚才自动生成的代码,我们的数据访问操作就靠这些代码了。另外顺表提一下,数据库的连接字符串放在工程根目录下的app.config文件里,这也是自动生成的,打开它,就可以看到连接字符串。以后如果要修改连接字符串,就修改这里。 好了,ORM构建好了,下面我们看看怎么用。 Step4:使用Linq to Sql访问数据库 using System;
using System.Collections.Generic; using System.Data.Linq; using System.Linq; using System.Text; using LinqToSqlDemo.Orm; namespace LinqToSqlDemo.Test { class Program { private static DataClassesDataContext dataContext = new DataClassesDataContext(); private static void Output() { //输出分类信息 foreach (Category c in dataContext.Categories) { Console.WriteLine("分类" + c.ID + ":" + c.Name); } //输出体育新闻下的公告信息 Category categorySport = dataContext.Categories.Single(c => c.Name == "体育新闻"); foreach (Bulletin b in categorySport.Bulletins) { Console.WriteLine("标题:" + b.Title); Console.WriteLine("内容:" + b.Content); Console.WriteLine("发布日期:" + b.Date); Console.WriteLine("所属分类:" + b.Category1.Name); } } private static void TestInsert() { //生成分类实体类 Category category1 = new Category() { Name = "国际要闻" }; Category category2 = new Category() { Name = "体育新闻" }; Category category3 = new Category() { Name = "财经快报" }; //生成公告实体类 Bulletin bulletin1 = new Bulletin() { Content = "曼联晋级冠军杯四强", Date = DateTime.Now, Title = "曼联晋级冠军杯四强" }; Bulletin bulletin2 = new Bulletin() { Content = "18:00直播亚冠首尔VS山东,敬请期待!!!", Date = DateTime.Now, Title = "18:00直播亚冠首尔VS山东" }; //将公告加入相应分类 category2.Bulletins.Add(bulletin1); category2.Bulletins.Add(bulletin2); //加入数据库 dataContext.Categories.InsertOnSubmit(category1); dataContext.Categories.InsertOnSubmit(category2); dataContext.Categories.InsertOnSubmit(category3); dataContext.SubmitChanges(); } private static void TestDelete() { dataContext.Categories.DeleteOnSubmit(dataContext.Categories.Single(c => c.Name == "国际要闻")); dataContext.SubmitChanges(); } private static void TestUpdate() { Category categoryFinance = dataContext.Categories.Single(c => c.Name == "财经快报"); categoryFinance.Name = "财经新闻"; dataContext.SubmitChanges(); } static void Main(string[] args) { Console.WriteLine("==============================Linq to SQL 测试=============================="); Console.WriteLine(); Console.WriteLine("==============================测试Insert=============================="); Console.WriteLine(); TestInsert(); Output(); Console.WriteLine("==============================测试Delete=============================="); Console.WriteLine(); TestDelete(); Output(); Console.WriteLine("==============================测试Update=============================="); Console.WriteLine(); TestUpdate(); Output(); Console.ReadLine(); } } }
一下子看不懂上述代码页没有关系,稍候我们会解释一下。现在,我们先来看运行结果: |
图5、测试程序运行结果 我们先来看看这段测试程序做了什么事。刚开始,数据库是空的,我们首先插入三个分类,并在“体育新闻”下插入两条公告,这是对Insert的测试。接着,我们删除了“国际要闻”分类,这是对Delete的测试。然后,我们将“财经快报”改为“财经新闻”,这是对Update测试。另外,整个过程的输出当然是对Select的测试。这样,数据库基本的操作都测试过了。从输出结果来看,我们的ORM组件运行很顺利,程序输出正确。 程序分析 取得数据库Gateway Insert操作 Delete操作 Update操作 Select操作 其它相关示例代码 常用Select操作举例 return dataContext.Categories.Single(c => c.ID == 3;
取得全部记录(全部分类) return dataContext.Categories;
得部分记录(所属分类ID为3的公告,按ID降序排列) return from b in dataContext.Bulletins
where b.Category == 3 orderby b.ID descending select b;
取得部分记录并分页,最后转换为List(所属分类ID为3的公告并分页,pageSize为每页多少条记录,pageNo为第几页) var bulletins = from b in dataContext.Bulletins
总结 好了,这篇文章就到这里了。希望能帮助大家快速上手Linq to Sql。关于Linq to Sql,还有许多丰富的功能和细节问题,篇幅原因不能详述,各位可以参考相关资料。 示例Demo下载 (本文由控件中国网转载) |