Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 LINQ ADO.NET JavaScript DataGridView GridView AjaxPro DevExpress 面向对象 Extjs XML HTML教程 Oracle jQuery WPF MVC 分页 Office2010 GDI+ Visual C++2010 Dojo MySQL VB.NET WCF4.0 ASPxGridView WinForm textbox Sql2005 cookie Discuz!NT checkbox WCF SQL经典语句 T-SQL F# asp.net VS2008 SQL Ajax DropDownList VS2008新特性 TreeView Access Flex 页面执行时间 字符串 DataSet VB2005 回调 动画 C#时间 游戏 ASP.NET MVC
尚未分类LINQ教程 Enterprise技术 性能优化/调试 水晶报表与打印 安全与加密 图形图像 文件处理 基础教程 Web Services 内置对象 控件示例 正则表达式\采集 ADO.NET 缓存\泛型\线程 XML技术 Url重写\静态页 vs2008综合教程
当前位置: 主页 > ASP.NET教程 > LINQ教程 >

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

时间:2010-02-21 10:01来源:未知 作者:admin 点击:

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

  第一篇:步步学LINQ to SQL:将类映射到数据库表

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

  本部分描述如何实现表间的映射关系:M:1,1:M和M:M。但是这里不会讨论1:1的映射关系,你可以在M:1的关系中发现这种1:1的映射关系。因此,从这里开始,我们将使用Book作为示例为你一步一步讲述这一实现过程。

  映射M:1的关系

  Book 对象与Category 对象是多对一的关系(M:1),因为一本书仅能属于某一个类别(并且每个类别能够包涵很多本书):

 


在数据库中,Book.catalog字段作为该表的外键,而在Category中作为主键。然而,在你的对象模型中,你很可能想让book.Catalog表示一个实际的Catalog对象(不仅仅是ID)。此时,你可以通过创建两个私有字段来实现这一映射关系,然后再对Category对象暴露一个公有属性。
  1.添加一个私有字段以进行其他表的关联
  添加一个私有字段,将其映射到Book.category数据库表的外键列。
  如果允许该字段为NULL,使用一个空类型即可实现(如,采用Int?的方式)。
  我将这个字段命名为categoryId(为了区别于我们后面将要创建的公有属性Category)。这意味着在Column特性上我必须得设置Name参数,因为我的字段名字和数据库表的字段名称不同:
  [Column( Name = "Category" )] private int? categoryId;
   2. 添加一个引用其他表的私有EntityRef类型字段
  添加一个私有类型的EntityRef字段以实现对Category实例的引用。虽然这会使得公有属性Category扮演一个后台字段的角色,但是通过使用EntityRef类型,仍然能达到延迟加载的目的(意思是LINQ不会即时从数据库获取数据直到我们真正想要数据的时候)。初始化EntityRef字段实例,以阻止NullReferenceExceptions发生。万一在某个地方你需要使用该对象的实例(如,Category)而此时又没有任何实例(Book)可用。
  private EntityRef _category = new EntityRef( );
   3. 使用[Association]特性添加一个公有属性进行类的关联
  最后,创建类型为public的Category属性,该属性用于接收实际的Category实例。 使用下面的参数为该属性添加Association特性:
  • 数据库两表之间的是关系名称Name(在本例为FK_Books_BookCategories))
  • IsForeignKey = true标记指定该类对应数据表的外键(在下面的ThisKey参数中进行了指定)。
  • 使用刚才创建的字段为该特性设置两个参数:
  (1)ThisKey用于指定到其它表的外键:categoryId。
  (2)Storage指定EntityRef用于接收其他类的实例:_category。
  在属性内部,代码的getter/setter访问器用于使用category的Entity属性,它包涵实际的Category实例:
  [Association( Name = "FK_Books_BookCategories",

  IsForeignKey = true, Storage = "_category", ThisKey = "categoryId" )]

  public Category Category{

  get { return _category.Entity; }

  set { _category.Entity = value; }

  }
   从M:1的关系上访问数据
  现在你可以通过这种关系以面向对象的方式访问Category的数据。例如,book.Category.Name:
  foreach( var book in bookCatalog.Books ) {

  string categoryName = book.Category.Name;

  }

 

在关联表中的M:1关系

  现在,咱们一起看看如何在M:M关联表中实现M:1的关系。当我们遇到表之间的关系为M:M时,正如这里的BookAuthors,当然,连接表的关系仍然是由两个M:1关系构成。

  例如,BookAuthor包涵一个到Book的M:1关系和一个到Author的M:1关系来构成M:M的关系:

 


不幸的是,你仍然需要创建一个类来映射这个关联表。然而,由于外键的原因,它仅仅用于映射的关系,你可以通过设置类的访问修饰符为internal来保持仅对外提供一个公共接口。
  1. 使用[Table]特性创建一个内部类用于映射需要连接的表
  以BookAuthors类相同的方式创建为其他实体类,但是不要将其标记为public:
  using System.Data.Linq;

  using System.Data.Linq.Mapping;

  namespace LINQDemo

  {

  [Table( Name = "BookAuthors" )]

  class BookAuthor{}

  }
   2. 映射两表之间的M:1关系,指定它们将其作为主键
  为Book和Author创建一个M:1的关系并以相同的方式为Book:Catalog创建关系。注意数据库中BookAuthors表的关系以下面的方式命名:
  • BookAuthor:Authors关系被命名为 FK_BookAuthors_Authors
  • BookAuthor:Books 关系被命名为FK_BookAuthors_Books
  分别在它的两个Column特性上为其添加IsPrimaryKey = true的属性以指示BookAuthors的主键由这两个值构成:
  [Table( Name = "BookAuthors" )]

  class BookAuthor

  {

  [Column( IsPrimaryKey = true, Name = "Author" )] private int authorId;

  private EntityRef _author = new EntityRef( );

  [Association( Name = "FK_BookAuthors_Authors", IsForeignKey = true,

  Storage = "_author", ThisKey = "authorId" )]

  public Author Author {

  get { return _author.Entity; }

  set { _author.Entity = value; }

  }

  Column( IsPrimaryKey = true, Name = "Book" )] private int bookId;

  private EntityRef _book = new EntityRef( );

  [Association( Name = "FK_BookAuthors_Books", IsForeignKey = true,

  Storage = "_book", ThisKey = "bookId" )]

  public Book Book {

  get { return _book.Entity; }

  set { _book.Entity = value; }

  }

  }
   虽然我们已经探讨了M:1的关系,但不幸的是,你仍然还不能使用BookAuthor做一些有趣的事,当我们在下面讨论M:M的关系时,将继续回到表连接的探讨话题上来。但首先,通过理解如何映射1:M的关系,我们可以看看Book:Catalog的关系来完整理解M:M的关系。
  映射1:M关系
  添加一个1:M的关系使得你可以获得一个属于Category的所有书籍列表。
  1. 在其它类中映射外键
  即使你正在为Category添加关联关系,它仍然需要知道如何关联到Book本身。因此,你仅需要确保你的Book类已经映射到了对应的列,该列应该是关联到Category的外键。如果你这样实现,那么你已经完成了1:M的关系,因此这时你所要做的就是指定字段名:categoryId:
  [Table( Name = "Books" )]

  public class Book

  {

  ...

  [Column( Name = "Category" )] private int? categoryId;
Tags:映射 LINQ To SQL
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价