你的位置:首页 > ASP.net教程

[ASP.net教程]Entity Framework的简单使用之多对多关系


在现实生活中,对象之间多对多的关系也比较常见。比如一篇博客对应多个目录,一个目录也可以对应多个博客。

下面我们就以博客和目录之间多对多关系进行讨论。

首先我们添加实体、映射以及对应的服务。

public class Blog : BaseEntity  {    public string BlogName { get; set; }    public virtual ICollection<Category> Categorys { get; set; }  }

View Code
public class Category:BaseEntity  {    public string CategoryName { get; set; }    public virtual ICollection<Blog> Blogs { get; set; }  }

View Code

现在我们来设置它们之间的映射关系,这点很重要:

public class BlogMap : EntityTypeConfiguration<Blog>  {    public BlogMap()    {      this.ToTable("Blog");      this.HasKey(c => c.Id);      HasMany(thisTable => thisTable.Categorys)        .WithMany(anotherForeignKeyTable => anotherForeignKeyTable.Blogs)        .Map(relationTable => relationTable          .MapLeftKey("BlogId")          .MapRightKey("CategoryId")          .ToTable("BlogCategorys")        );    }  }

View Code
public class CategoryMap : EntityTypeConfiguration<Category>  {    public CategoryMap()    {      this.ToTable("Category");      this.HasKey(c => c.Id);    }  }

View Code

多对多关系会涉及到三个表:Blog(博客)、BlogCategorys(中间表)、Category(目录),中间表只是保存Blog、Category的id值。

我们来看一下测试的结果:

 

由上图可以看到,blog可以关联多个category,category也可以关联多个blog。

其实,多对多关系也可以转化为两个一对多的关系。由于关联的对象是延迟加载的(即加了virtual关键字的属性),在实际使用时才去查询数据库,因此,关联对象比较多时,会频繁地访问数据库,导致性能很低。所以,如果延迟加载的数据量比较多时,可以考虑将其之间查询出来再使用。