技术开发 频道

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

  2. 映射你自己的主键

  LINQ会比较Book的外键和Category的外键,因此你需要映射Category.Id并标识其作为主键([Column (IsPrimaryKey = true)])。再次,如果你继续这个步骤,你已经在实体类中完成了该过程的创建。因此,所要做的仅仅是为该属性名Id添加一个注释:

  [Table (Name="BookCategories")]

  
public class Category

  {

  [Column ( IsPrimaryKey
= true, IsDbGenerated = true )] public int Id { get; set; }

  ...

   3. 添加一个私有的EntitySet类型以实现对其他表的引用

  添加一个私有的EntitySet字段来接收属于该Category的书籍。这将让我们的公有Books属性扮演字段的角色。类似地,EntityRef,EntitySet会引起对Books的加载延迟直到我们实际访问它的时候(因此,当我们需要查看一个类别的时候,我们不必每次都返回所有书的列表)。

  初始化EntitySet字段以避免NullReferenceExceptions异常的发生,比如在你没有设置两边关系的时候(如一个类别没有书籍的时候)

  private EntitySet _books = new EntitySet();

   4. 为相关联的类添加属性

  最后创建公有Books属性,它用于接收在对应类别中的书籍。为该属性添加一个Association特性。并设置数据库关系的名称参数为Name (FK_Books_BookCategories),以及使用刚才创建这个字段的特性所需要的三个参数:

  ·OtherKey指定关联到其他类(Book)的字段,该字段接收所关联的外键:categoryId

  ·ThisKey指定你的主键(OtherKey所应该匹配的字段): Id

  ·Storage指定你的EntitySet类型,该类型用来存储相关联的Books集合:_books.

  在属性内部,代码getter/setter访问修饰符使用了 _books,它包涵一个实际Book实例的ICollection集合:

  [Association( Name = "FK_Books_BookCategories",

  Storage
= "_books", OtherKey = "categoryId", ThisKey = "Id" )]

  
public ICollection Books {

  
get { return _books; }

  
set { _books.Assign( value ); }

  }

   从1:M 关系上访问数据

  现在,你可以通过使用category.Books属性访问每个类别中的Books列表:

  foreach( var category in bookCatalog.Categories ){

  
foreach( Book book in category.Books ){

  
string bookTitle = book.Title;

  }

  }

   映射M:M 关系

  最后,添加M:M关系,这可以允许你直接从Book实例中访问每个目录下下的所有作者,以及从Author实例中直接访问某个作者写的所有书籍。

  通过创建BookAuthor类,说明你已经完成了该任务的大部分工作了。并且,你也在前面部分已经了解到当你需要创建1:M时如何实现这一功能。现在,是该将它们整合起来的时候了。再次,我们将使用Book作为示例进行阐述。

  1. 从类到关联的表上添加一个1:M的关系

  Book到BookAuthor 它存在一个1:M的关系,每本书都可以有多个作者,但是每本书作者仅仅属于一本书。因此,你必须得从先前已有的部分开始进行如下四个步骤:

  ·bookId. 在BookAuthor类中映射到Book的外键。你已经这样实现了,会调用它的:bookId。

  ·为Book对象定义主键。你也已经这样实现了,会调用它的:Id。

  ·Add an EntitySet that references the other table: _bookAuthors. 添加一个引用其他表的EntitySet类型。

  ·添加一个BookAuthors属性(将其设置为私有的,因为这里仅仅用于帮助获得作者列表),该属性添加了Association特性并为其设置前面部分设置的三个参数值。

  添加Book对象代码的第3和第4步如下:

  [Table( Name = "Books" )]

  
public class Book

  {

  ...

  
private EntitySet _bookAuthors = new EntitySet( );

  [Association( Name
= "FK_BookAuthors_Books",

  Storage
= "_bookAuthors", OtherKey = "bookId",

  ThisKey
= "Id" )]

  
private ICollection BookAuthors {

  
get { return _bookAuthors; }

  
set { _bookAuthors.Assign( value ); }

  }

 

0
相关文章