技术开发 频道

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

  在关联表中的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;
0
相关文章