在现实生活中,对象之间多对多的关系也比较常见。比如一篇博客对应多个目录,一个目录也可以对应多个博客。
下面我们就以博客和目录之间多对多关系进行讨论。
首先我们添加实体、映射以及对应的服务。
public class Blog : BaseEntity { public string BlogName { get; set; } public virtual ICollection<Category> Categorys { get; set; } }
public class Category:BaseEntity { public string CategoryName { get; set; } public virtual ICollection<Blog> Blogs { get; set; } }
现在我们来设置它们之间的映射关系,这点很重要:
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") ); } }
public class CategoryMap : EntityTypeConfiguration<Category> { public CategoryMap() { this.ToTable("Category"); this.HasKey(c => c.Id); } }
多对多关系会涉及到三个表:Blog(博客)、BlogCategorys(中间表)、Category(目录),中间表只是保存Blog、Category的id值。
我们来看一下测试的结果:
由上图可以看到,blog可以关联多个category,category也可以关联多个blog。
其实,多对多关系也可以转化为两个一对多的关系。由于关联的对象是延迟加载的(即加了virtual关键字的属性),在实际使用时才去查询数据库,因此,关联对象比较多时,会频繁地访问数据库,导致性能很低。所以,如果延迟加载的数据量比较多时,可以考虑将其之间查询出来再使用。