【IT168 专稿】该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定。即使你选择使用了自动生成类的工具,理解这一实现过程可以让你更加方便地对你的应用程序加以扩展。

 第二篇:步步学LINQ to SQL:使用LINQ检索数据

 第三篇:步步学LINQ to SQL:为实体类添加关系

  下面阐述本文的目标以及该示例程序为初级开发人员介绍如何学习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")])。如果名称是相同的,此时你可以忽略该参数。

  using System.Data.Linq.Mapping;

  namespace LINQDemo

  {

  [Database]

  publicclass BookCatalog : DataContext{}

  }

  (2)添加一个带数据库连接字符串的构造函数

  添加一个带有数据库连接字符串为参数的构造函数,并调用base()方法以告诉父类如何连接你的数据库。

  该构造函数的数据库连接字符串以参数的形式读取,它可以是从一个属性文件读取,或者直接硬编码到函数中,在本文的示例中我们就采用了硬编码这样的方式(假设这里的字符串连接到SQL Server Compact数据库,BookCatalog.sdf,该文件与BookCatalog.mdf位于相同的目录):

  public BookCatalog( ) : base( "Data Source=.\\SQLEXPRESS;"+

  "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;

  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参数的设置。

  using System.Data.Linq.Mapping;

  namespace LINQDemo

  {

  [Table( Name ="Books" )]

  publicclass Book{}

  }

  (2)使用[Column( IsPrimaryKey = true )]特性添加一个字段作为表的主键。

  如果你喜欢,你也可以为为其添加一个Column特性,这也是Book Catalog应用程序所采用的方式。

  如果你的主键在数据库中设置成了Identity,那么需要添加一个参数IsDbGenerated = true。相对于数据库列名,如果你想为字段或属性设置成不同的名字,可以使用(Name="")标签来实现.否则程序会默认以你的字段或属性名称作为列名,正如我们这里的Book's主键:Id那样。

  [Column( IsPrimaryKey =true, IsDbGenerated =true )]

  publicint Id { get; set; }

  (3)使用[Column]特性为表添加其他非关系列

  后面部分我们将会回到关系对象上来。现在,咱们开始了解表对象的非主键,外键列。Book有两个这样的列:Title 和 Price。其数据类型由数据库的money类型转换到了.NET的decimal类型,以及由varchars类型转换到了.NET的string类型。LINQ会自动为你处理这些数据类型之间的转换。

  [Column] publicstring Title { get; set; }

  [Column] publicdecimal Price { get; set; }

  Book Catalog应用程序的Author和Category也进行了这样的处理,即这三个类对象都对应于自己的数据表:

  using System.Data.Linq.Mapping;

  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:将类映射到数据库表【转】的更多相关文章

  1. 步步学LINQ to SQL:为实体类添加关系【转】

    [IT168 专稿]本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 第一 ...

  2. 步步学LINQ to SQL:使用LINQ检索数据【转】

    [IT168 专稿]该系列教程描述了如何采用手动的方式映射你的对象类到数据表(而不是使用象SqlMetal这样的自动化工具)以便能够支持数据表之间的M:M关系和使用实体类的数据绑定.即使你选择使用了自 ...

  3. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  4. 一步一步学Linq to sql(五):存储过程

    普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...

  5. SQL通过Datatable更新数据库表内容

    SQL通过Datatable更新数据库表内容   //要注意的一点是在Select语句中要选择的列中必须包含主键的列,此外不支持多表连接查询 DataTable dt = new DataTable( ...

  6. 一步一步学Linq to sql(六):探究特性

    延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要使用 ...

  7. 一步一步学Linq to sql(四):查询句法

    select 描述:查询顾客的公司名.地址信息 查询句法: var 构建匿名类型1 = from c in ctx.Customers select new { 公司名 = c.CompanyName ...

  8. 一步一步学Linq to sql(三):增删改

    示例数据库 字段名 字段类型 允许空 字段说明 ID uniqueidentifier 表主键字段 UserName varchar(50) 留言用户名 PostTime datetime 留言时间 ...

  9. 一步一步学Linq to sql(二):DataContext与实体

    DataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入 ...

随机推荐

  1. iOS开发-CGAffineTransformMakeRotation改变了中心解决的方法

    坑爹的.  为了这个问题折腾了2个小时. 恼.. 今天在写一个时钟demo的时候, 时针的旋转用到了CGAffineTransformMakeRotation, 按理说. 图像的旋转是以图像本身的中心 ...

  2. yarn状态机的可视化

    YARN为了实现多个状态机的对象,控制ResourceManager中间RMAppImpl.RMApp-AttemptImpl.RMContainerImpl和RMNodeImpl,NodeManag ...

  3. iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  4. activity之栈管理

    在android中.一个activity组件能够激活还有一个activity组件:本程序activity和其他程序的activity.     若新的被激活的activity组件属于还有一个应用程序, ...

  5. linux C连接mysql

    linux 环境下C语言连接数据库首先要配置环境 1,确定你的linux下安装mysql我们可以做个测试. 打开你的终端,在终端下输入:service mysqld status [root@bogo ...

  6. CentOS7安装mysql5.6.23 -(转)

    一.下载glibc版本的Mysql mysql-advanced-5.6.23-linux-glibc2.5-x86_64.zip 解压后,得到 mysql-advanced-5.6.23-linux ...

  7. smaba服务的搭建

    一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件 ...

  8. 配置基于NotePad++工具下的C#开发环境

    1.打开NotePad++,打开Notepad++的插件(plugins)菜单-->Plugin Manager-->Show Plugin Manager-->勾选NppExec- ...

  9. Android图片编译报错

    一. AAPT err(1118615418): ERROR: 9-patch image icon_item_bottom_line.9.png malformed No marked region ...

  10. C# 和Java的foreach的不同用法

    循环语句为苦逼的程序猿们提供了很大的便利,有while.do...while.for和 foreach.而且foreach语句很简洁,但是它的优点不仅仅在于此,它的效率也是最高的. 作为两个开发语言, ...