走进Linq-Linq to SQL How do I(2)
[1] 走进Linq-Linq to SQL How do I(2)
[2] 走进Linq-Linq to SQL How do I(2)
[3] 走进Linq-Linq to SQL How do I(2)
[4] 走进Linq-Linq to SQL How do I(2)
[2] 走进Linq-Linq to SQL How do I(2)
[3] 走进Linq-Linq to SQL How do I(2)
[4] 走进Linq-Linq to SQL How do I(2)
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
一对多关系
在上面的映射中,Blog还有一个属性:Posts,我们并没有做什么处理,实际上这个应该是根据Blog的Id属性关联到Post的BlogId属性,进行关联的。
为此我们要修改一下这个Blog的映射:
///
/// 一个博客有零篇或多篇文章,
///
[Association(OtherKey = "BlogId")]
public EntitySet<Post> Posts { get; set; }
使用Association建立映射关系,她有一个OtherKey属性,该属性指定为被关联的那个对象中做连接的那个属性(外键)(这里被关联的就是Post类,做连接的那个属性就是BlogId,她也是posts表的外键),还要注意的是,我们要把原来使用的IList换成EntitySet,EntitySet是Linq新提供的一个类,在System.Data.Linq命名空间下。
/// 一个博客有零篇或多篇文章,
///
[Association(OtherKey = "BlogId")]
public EntitySet<Post> Posts { get; set; }
下面来看看例子:
var result = from blog in dbContext.GetTable<Blog>()
where blog.Id == 1
select blog;
foreach (var item in result)
{
Console.WriteLine(item.Name);
if (item.Posts == null || item.Posts.Count <= 0) return;
foreach (var post in item.Posts)
{
Console.WriteLine(post.Title);
}
}
where blog.Id == 1
select blog;
foreach (var item in result)
{
Console.WriteLine(item.Name);
if (item.Posts == null || item.Posts.Count <= 0) return;
foreach (var post in item.Posts)
{
Console.WriteLine(post.Title);
}
}
我们只要对blog进行查询就ok了,和她关联的Post自动的会映射过来的。
上面的例子只表明了在Blog类里,如何关联到该博客的所有Post,如果我在Post里想关联到该Post属于哪个博客呢?
在Post类里添加:
//注意,用的是EntityRef
private EntityRef<Blog> _blog;
//从这里可以看出Storage属性的作用了吧,这里的ThisKey指定的是
//本类里面的BlogId,一个外键,并不是主键了哦。
[Association(Storage="_blog",ThisKey="BlogId")]
public Blog Blog
{
get { return _blog.Entity; }
set { _blog.Entity = value; }
}
private EntityRef<Blog> _blog;
//从这里可以看出Storage属性的作用了吧,这里的ThisKey指定的是
//本类里面的BlogId,一个外键,并不是主键了哦。
[Association(Storage="_blog",ThisKey="BlogId")]
public Blog Blog
{
get { return _blog.Entity; }
set { _blog.Entity = value; }
}
这样就ok了,你查一个Post的时候会自动的把其所属的博客也给弄出来哦。而且这个EntityRef还是支持延迟加载的。