步步学LINQ to SQL:将类映射到数据库表【转】
【IT168 专稿】该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定。即使你选择使用了自动生成类的工具,理解这一实现过程可以让你更加方便地对你的应用程序加以扩展。
下面阐述本文的目标以及该示例程序为初级开发人员介绍如何学习LINQ的基本要点:
·使用LINQ to SQL将SQL Server数据库表映射到与之关联的对象上。
·执行一些简单的LINQ查询来检索数据。
本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL。附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集。
开始部分:LINQ to SQL是一种对象关系隐射工具,该工具允许你在.NET 3.5框架平台上将SQL Server数据库映射成对象类。
数据库:该示例使用SQL Server Express作为数据库,在该数据库中包涵了Books, Authors, 和 Categories三张数据表。每本书仅仅属于某一图书类别,但是每本书可有多个作者,每个作者可以写多本书。BookAuthors表用于处理books表和authors表之间的多对多关系。为简单起见,除了Books.Category列以外,其余列都不允许为空。

这些表可以允许我们针对每个主类型进行关系(1:M,M:1,和M:M)之间的映射。
本文的其余部分将描述如何将应用程序的数据表与它们的对象类关联起来以及如何使用LINQ来检索结果集。LINQ将使用这些数据表作为示例来阐述这些概念。
应用程序:使用LINQ to SQL, 创建一个.NET 3.5框架之上的工程并添加对程序集 System.Data.Linq的引用。
1.映射DataContext到数据库
如果你为数据库创建了一个强类型的DataContext,则该类只会对外提供一个单一的入口点,使得外界可以方便地的访问你的数据。该类将负责处理数据库的连接并定义你需要连接的每张数据库表。
*注意: 在DataContext类中你可以忽略M:M的表连接(例如:BookAuthor),因为它们仅仅使用they're only used behind the scenes to hook up M:M relationships(在本文的后半部分会进行阐述)。
(1)创建一个使用了 [Database]特性的类来扩展 DataContext
创建一个扩展自DataContext的数据库类,并为其添加[Database]特性以表明该类被映射到了数据库。
如果你使用的类名与数据库的名称不一样,那么你可以通过使用特性的Name参数进行设定([Database (Name="BookCatalog")])。如果名称是相同的,此时你可以忽略该参数。
namespace LINQDemo
{
[Database]
publicclass BookCatalog : DataContext{}
}
(2)添加一个带数据库连接字符串的构造函数
添加一个带有数据库连接字符串为参数的构造函数,并调用base()方法以告诉父类如何连接你的数据库。
该构造函数的数据库连接字符串以参数的形式读取,它可以是从一个属性文件读取,或者直接硬编码到函数中,在本文的示例中我们就采用了硬编码这样的方式(假设这里的字符串连接到SQL Server Compact数据库,BookCatalog.sdf,该文件与BookCatalog.mdf位于相同的目录):
"AttachDbFilename=|DataDirectory|\\BookCatalog.mdf;"+
"Integrated Security=True;User Instance=True" ) { }
注意,在工程中,Book Catalog示例包括了数据库,和BookCatalog.sdf文件。对于使用LINQ to SQL来说,这不是必要的,在这里仅仅只是加以说明而已。(3)申明数据表
最后,你可以为每张数据表创建一个类型为Table的对象类集合。
通常,你可以先创建这些类,下面我们来看看这一创建过程。我们将创建三个类(Author, Book, 和Category)--每个类对应一张数据表。因此,我们将为每个类类型添加一个Table集合并将这些集合命名为一个有意义的名字。注意,为数据库表名对应的类或集合命名不是必须的。我们将在下一节了解如何为数据表指定名称。
using System.Data.Linq.Mapping;
namespace LINQDemo
{
[Database]
publicclass BookCatalog : DataContext
{
public BookCatalog( ) : base( ... );
public Table Authors;
public Table Books;
public Table Categories;
}
}
2.将实体类映射到数据库表
为连接到应用程序的每张数据库表创建类对象。我们将以Book表为例子阐述这一实现过程。
(1)创建带有[Table]特性的类
创建一个特性为Table的Book类将其映射到对应的数据库表。
为数据库表的Name参数指定名称([Table( Name = "Books" )])。这里我们这样做是因为表的名称(Books)和我们的类名(Book)不同。如果它们相同,可以忽略该Name参数的设置。
namespace LINQDemo
{
[Table( Name ="Books" )]
publicclass Book{}
}
(2)使用[Column( IsPrimaryKey = true )]特性添加一个字段作为表的主键。
如果你喜欢,你也可以为为其添加一个Column特性,这也是Book Catalog应用程序所采用的方式。
如果你的主键在数据库中设置成了Identity,那么需要添加一个参数IsDbGenerated = true。相对于数据库列名,如果你想为字段或属性设置成不同的名字,可以使用(Name="")标签来实现.否则程序会默认以你的字段或属性名称作为列名,正如我们这里的Book's主键:Id那样。
publicint Id { get; set; }
(3)使用[Column]特性为表添加其他非关系列
后面部分我们将会回到关系对象上来。现在,咱们开始了解表对象的非主键,外键列。Book有两个这样的列:Title 和 Price。其数据类型由数据库的money类型转换到了.NET的decimal类型,以及由varchars类型转换到了.NET的string类型。LINQ会自动为你处理这些数据类型之间的转换。
[Column] publicdecimal Price { get; set; }
Book Catalog应用程序的Author和Category也进行了这样的处理,即这三个类对象都对应于自己的数据表:
namespace LINQDemo
{
[Table( Name ="Books" )]
publicclass Book
{
[Column( IsPrimaryKey =true, IsDbGenerated =true )] publicint Id { get; set; }
[Column] publicstring Title { get; set; }
[Column] publicdecimal Price { get; set; }
}
[Table (Name="Authors")]
publicclass Author
{
[Column (IsPrimaryKey =true, IsDbGenerated =true )] publicint Id { get; set; }
[Column] publicstring Name { get; set; }
}
[Table (Name="BookCategories")]
publicclass Category
{
[Column (IsPrimaryKey =true, IsDbGenerated =true )] publicint Id { get; set; }
[Column] publicstring Name { get; set; }
}
}
步步学LINQ to SQL:将类映射到数据库表【转】的更多相关文章
- 步步学LINQ to SQL:为实体类添加关系【转】
[IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...
- 步步学LINQ to SQL:使用LINQ检索数据【转】
[IT168 专稿]该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定.即使你选择使用了自 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 一步一步学Linq to sql(五):存储过程
普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...
- SQL通过Datatable更新数据库表内容
SQL通过Datatable更新数据库表内容 //要注意的一点是在Select语句中要选择的列中必须包含主键的列,此外不支持多表连接查询 DataTable dt = new DataTable( ...
- 一步一步学Linq to sql(六):探究特性
延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要使用 ...
- 一步一步学Linq to sql(四):查询句法
select 描述:查询顾客的公司名.地址信息 查询句法: var 构建匿名类型1 = from c in ctx.Customers select new { 公司名 = c.CompanyName ...
- 一步一步学Linq to sql(三):增删改
示例数据库 字段名 字段类型 允许空 字段说明 ID uniqueidentifier 表主键字段 UserName varchar(50) 留言用户名 PostTime datetime 留言时间 ...
- 一步一步学Linq to sql(二):DataContext与实体
DataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入 ...
随机推荐
- MongoDB C Driver and APIinstances linux MongoDB安装配置
<一,linux平台MongoDB安装配置>在这我们使用的Centos6 yum部署的,你想搞编译,自个干!
- PHP MySQL Delete From 之 Delete
删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_name WHERE column_name = some_value 注释:SQ ...
- ios7 UITableView底线右移
在ios7上UITableView底线右移了,我们可以通过添加代码来让它铺满整个屏幕的宽,在使用前要加上判断是否有这个方法 if ([_tableView respondsToSelector:@se ...
- Comet学习资料
什么是Comet: http://baike.baidu.com/view/577938.htm?fr=ala0_1 Comet介绍: http://www.ibm.com/developerwork ...
- 王立平-Android中对图像进行Base64编码
// ------------------base64-------------------// public String bitmaptoString(Bitmap bitmap) { // 将B ...
- MFC多线程内存泄漏问题&解决方法
在用visual studio进行界面编程时(如MFC),前台UI我们能够通过MFC的消息循环机制实现.而对于后台的数据处理.我们可能会用到多线程来处理. 那么对于大多数人(尤其是我这样的菜鸟),一个 ...
- error: ‘for’ loop initial declarations are only allowed in
使用gcc,出现如下错误: thread_join.c:7:5: error: 'for' loop initial declarations are only allowed in C99 mode ...
- Android平台抓取native crash log
Android开发中,在Java层可以方便的捕获crashlog,但对于 Native 层的 crashlog 通常无法直接获取,只能通过系统的logcat来分析crash日志. 做过 Linux 和 ...
- 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2
网上这种文档一搜就一堆,没别的目的,刚接触oracle为了加深理解记忆.只要是跟我的版本一样操作系统和oracle软件,按照步骤肯定可以成功安装 在虚拟机上安装Red Hat Enterprise L ...
- bootstrap之 formgroup表单布局样式
<form class="form-horizontal" role="form"> <fieldset> <legend> ...