【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. GridBagLayout练习

    摘自http://blog.csdn.net/qq_18989901/article/details/52403737  GridBagLayout的用法 GridBagLayout是面板设计中最复杂 ...

  2. OpenCV MFC 模块间通信

    1. 新建MFC项目 点击完成. 2. 添加按钮 在"工具箱"中找到"Button"控件,添加至界面:  2. 配置opencv, 添加colordetecto ...

  3. DAT文件怎样打开

    DAT文件类型主要是"数据"文件.能够是不论什么内容,比方:文字,图形,视频或一般的二进制数据,它并没有统一详细的结构.所以您不能理解它也相应一个用来打开它的应用程序.比方你看到一 ...

  4. Android系统休眠对程序的影响以及处理

    Android系统在用户长时间不操作时,为了节省资源,系统会选择休眠.在休眠过程中自定义的Timer.Handler.Thread.Service等都会暂停.而有时候这种机制会影响到我们程序的正常运行 ...

  5. Convert Sorted List to Binary Search Tree java

    public TreeNode sortedListToBST(ListNode head) { if(head==null) return new TreeNode(0); ArrayList< ...

  6. My97DatePicker使用的问题

    我在iframe中使用My97DatePicker时,发现第一次点击左边的菜单时,在右边的页面可以弹出日期框: 当我第二次点击菜单时,右边的日期文本框却弹出了页面的内容,而不是日期选择框: 首先怀疑是 ...

  7. weblogic上部署应用程序

    weblogic上部署应用程序有三种方法: 一:修改配置文件config.xml在文件中加入如下代码片段: <app-deployment> <name>FAB</nam ...

  8. AdapterView及其子类之四:基于ListView及SimpleAdapter实现列表

    代码请见SimpleAdapterDemo.zip. 步骤如下: 1.创建主布局文件 <RelativeLayout xmlns:android="http://schemas.and ...

  9. NPOI导出多张图片到Excel

    常用NPOI导出数据到excel,但没有试过如何导出图片.NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel.在单元格中插入图片主要是用HSSFClientAnchor对象.他有 ...

  10. 1003 Crashing Balloon

    考察DFS的应用,判断两个数的因子. #include <stdio.h> int f1,f2; void DFS(int m,int n,int k){ ){ f2=; ) f1=; } ...