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关键字的属性),在实际使用时才去查询数据库,因此,关联对象比较多时,会频繁地访问数据库,导致性能很低。所以,如果延迟加载的数据量比较多时,可以考虑将其之间查询出来再使用。

原文地址:https://www.cnblogs.com/dengwenbo/p/4771997.html