关系型数据库一般有一对一、一对多、多带多的关系。在EF中,也存在这三种关系,下面我们就先讨论一下一对一的关系。
在博客系统中,一个博客只能对应一个用户,而一个用户可以对应多个博客。这就是一对一和一对多关系的体现。
在没有设置一对一关系时,返回的数据如下:
public class Blog:BaseEntity { public string BlogName { get; set; } public string BlogUrl { get; set; } public string BlogContent { get; set; } public int UserId { get; set; } //public BlogUser BlogUser { get; set; } }
public BlogMap() { this.ToTable("Blog"); this.HasKey(c => c.Id); //this.HasRequired(ci => ci.BlogUser).WithMany().HasForeignKey(p => p.UserId); }
如果我想得到博客对应的用户,那么我们还得根据用户id再查找一次。我们可不可以在获取博客的时候顺便也把对应的用户一起获取出来呢?答案是可以的。
public class Blog:BaseEntity { public string BlogName { get; set; } public string BlogUrl { get; set; } public string BlogContent { get; set; } public int UserId { get; set; } public virtual BlogUser BlogUser { get; set; } }
public BlogMap() { this.ToTable("Blog"); this.HasKey(c => c.Id); this.HasRequired(ci => ci.BlogUser).WithMany().HasForeignKey(p => p.UserId); }
这样,就把博客跟用户的一对一的关系建立起来了。
通过运行结果,我们可以发现:
BlogUser对应已经加载出来了,只不过此时仍是linq对象
但是我们可以直接使用该对象。
不过细心的读者可能会发现,为什么BlogUser要声明为virtual呢?这就是EF的延迟加载机制,关于延迟加载,后面会进行讨论。