技术开发 频道

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

  【IT168 专稿】本文详细为你阐述了如何在你的应用程序中实现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;

  }

 

0
相关文章