2. 映射你自己的主键
LINQ会比较Book的外键和Category的外键,因此你需要映射Category.Id并标识其作为主键([Column (IsPrimaryKey = true)])。再次,如果你继续这个步骤,你已经在实体类中完成了该过程的创建。因此,所要做的仅仅是为该属性名Id添加一个注释:
public class Category
{
[Column ( IsPrimaryKey = true, IsDbGenerated = true )] public int Id { get; set; }
...
3. 添加一个私有的EntitySet
添加一个私有的EntitySet
初始化EntitySet字段以避免NullReferenceExceptions异常的发生,比如在你没有设置两边关系的时候(如一个类别没有书籍的时候)
4. 为相关联的类添加属性
最后创建公有Books属性,它用于接收在对应类别中的书籍。为该属性添加一个Association特性。并设置数据库关系的名称参数为Name (FK_Books_BookCategories),以及使用刚才创建这个字段的特性所需要的三个参数:
·OtherKey指定关联到其他类(Book)的字段,该字段接收所关联的外键:categoryId
·ThisKey指定你的主键(OtherKey所应该匹配的字段): Id
·Storage指定你的EntitySet
在属性内部,代码getter/setter访问修饰符使用了 _books,它包涵一个实际Book实例的ICollection集合:
Storage = "_books", OtherKey = "categoryId", ThisKey = "Id" )]
public ICollection Books {
get { return _books; }
set { _books.Assign( value ); }
}
从1:M 关系上访问数据
现在,你可以通过使用category.Books属性访问每个类别中的Books列表:
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
·添加一个BookAuthors属性(将其设置为私有的,因为这里仅仅用于帮助获得作者列表),该属性添加了Association特性并为其设置前面部分设置的三个参数值。
添加Book对象代码的第3和第4步如下:
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 ); }
}