EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading)、贪婪加载 (Eager Loading)以及显示加载。

一、EF Core  1.1

1.当前的版本,还不支持延迟加载(Lazy Loading),不将来是否支持

2.目前支持贪婪加载:使用Include加载 关联表 的数据,这种方式 使用一条Join的 Sql语句进行查询。

3. 贪婪加载的优势在于仅执行1次SQL查询即返回所需要的结果。但使用JOIN查询在数据库记录条数较多时,多条简单的SQL查询往往比一条复杂的JOIN查询效率要好。

Include语句可以在 一次查询中使用多次 :

ctx.Categories
.Include(c => c.Products)
.Include(c => c.News);

4.限制加载的方式暂时忽略使用。

二、EF Core 中主外键设置

1.使用数据注释,DataAnnotations模式,这种方式适合Code First或者说手写实体类和自定义主外键 关联。

Menu表

[Table("Menu")]
public partial class Menu
{
[Key]
public int MenuID { get; set; }
public string MenuName { get; set; } public string LinkUrl { get; set; }
public DateTime AddTime { get; set; }
public int SortNumber { get; set; } public int ModelID { get; set; } [ForeignKey("ModelID")]
public virtual Model Model { get; set; }
}

Model表

[Table("Model")]
public partial class Model
{ public Model()
{
this.Menus = new HashSet<Menu>();
} [Key]
public int ModelID { get; set; }
public string ModelName { get; set; }
public int SortNumber { get; set; } public DateTime AddTime { get; set; } public virtual ICollection<Menu> Menus { get; set; } }

上下文类

    public class MenuModelContext : DbContext
{ public virtual DbSet<Menu> Menus { get; set; }
public virtual DbSet<Model> Models { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;database=MenuModel;Trusted_Connection=True;");
}
}

2.使用Fluent API模式,这种方式,是自动DBFirst自动生成实体层的默认方式

Menu表

public partial class Menu
{
public int MenuId { get; set; }
public string MenuName { get; set; }
public string LinkUrl { get; set; }
public DateTime AddTime { get; set; }
public int SortNumber { get; set; }
public int ModelId { get; set; } public virtual Model Model { get; set; }
}

Model表

public partial class Model
{
public Model()
{
Menu = new HashSet<Menu>();
} public int ModelId { get; set; }
public string ModelName { get; set; }
public int SortNumber { get; set; }
public DateTime AddTime { get; set; } public virtual ICollection<Menu> Menu { get; set; }
}

上下文类:

public partial class MenuModelContext : DbContext
{
public virtual DbSet<Menu> Menu { get; set; }
public virtual DbSet<Model> Model { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;database=MenuModel;Trusted_Connection=True;");
} protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Menu>(entity =>
{
entity.Property(e => e.MenuId).HasColumnName("MenuID"); entity.Property(e => e.AddTime).HasColumnType("datetime"); entity.Property(e => e.LinkUrl).HasMaxLength(); entity.Property(e => e.MenuName)
.IsRequired()
.HasMaxLength(); entity.Property(e => e.ModelId).HasColumnName("ModelID"); entity.HasOne(d => d.Model)
.WithMany(p => p.Menu)
.HasForeignKey(d => d.ModelId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK__Menu__ModelID__25869641");
}); modelBuilder.Entity<Model>(entity =>
{
entity.Property(e => e.ModelId).HasColumnName("ModelID"); entity.Property(e => e.AddTime).HasColumnType("datetime"); entity.Property(e => e.ModelName)
.IsRequired()
.HasMaxLength();
});
}
}

三、使用Include 获取关联表数据实例

注 :使用Include 方式获取的数据为对应类型的对象,而不是动态类型Dynamic_xxxx

MenuModelContext _Context = new MenuModelContext();
List<Menu> list = _Context.Menus
.Include(q => q.Model) //手动指定关联表查询,一对一
.ToList();
foreach (var item in list)
{
Console.WriteLine(item.MenuName);
Console.WriteLine(item.Model);
}
MenuModelContext _Context = new MenuModelContext();
List<Model> list = _Context.Models
.Include(q => q.Menus) //手动指定关联表查询,一对多
.ToList();
foreach (var item in list)
{
Console.WriteLine(item.ModelName);
Console.WriteLine(item.Menus.Count);
}

更多 :

.NetCore中EFCore的使用整理

Asp.Net Core MVC控制器和视图之间传值

VS Code搭建.NetCore开发环境(二)

Ef core的其他参考:

http://www.cnblogs.com/libingql/p/3381571.html

http://www.infoq.com/cn/news/2016/08/EF-Core-Roadmap

http://blog.csdn.net/ceg6648/article/details/54767133

.NetCore中EFCore的使用整理(二)-关联表查询的更多相关文章

  1. .NetCore中EFCore for MySql整理(二)

    一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...

  2. .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql

    一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...

  3. .NetCore中EFCore的使用整理(三)-关联表操作

    一.查询关联表数据 StudyAboard_TestContext _context = new StudyAboard_TestContext(); CrmRole role = _context. ...

  4. .NetCore中EFCore for MySql整理

    一.MySql官方提供了Ef Core对MySql的支持,但现在还处于预览版 Install-Package MySql.Data.EntityFrameworkCore -Pre Install-P ...

  5. .NetCore中EFCore的使用整理

    EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术. 其中的.NetCore版本对应EntityFrameworkCore Git源代码地址:https://git ...

  6. Mybatis源码分析--关联表查询及延迟加载原理(二)

    在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...

  7. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  8. SpringBoot Data JPA 关联表查询的方法

    SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店 ...

  9. 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询

    MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...

随机推荐

  1. 树形插件 --- zTree

    地址:http://www.treejs.cn/v3/api.php

  2. php中类继承和接口继承的对比

    PHP类继承: 1.PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承,比如: class frist{ public function __construct(){ echo &q ...

  3. python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool)

    昨日内容回顾 进程 multiprocess Process —— 进程 在python中创建一个进程的模块 start daemon 守护进程 join 等待子进程执行结束 锁 Lock acqui ...

  4. String中的toCharArray:将此字符串转换为新的字符数组,并统计次数

    package stringyiwen; public class StringTestToCharArray { public static void main(String[] args) { S ...

  5. ERP发货系统的修改(四十三)

    产品添加批号后相应修改产品库存表中对应批次产品的数量: /// <summary> /// 产品添加批号后相应修改产品库存表中对应批次产品的数量 /// </summary> ...

  6. git merge简介

    git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...

  7. Hibernate之开门见山

    1:SSH框架: Struts2:基于mvc模式的应用层框架模式(Servlet层) Hibernate:基于持久层的框架(数据访问层) Spring:创建对象对象处理的依赖关系以及框架整合(Serv ...

  8. POJ3237 Tree 树链剖分 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...

  9. 教程:Visual Studio 中的 Django Web 框架入门

    教程:Visual Studio 中的 Django Web 框架入门 Django 是高级 Python 框架,用于快速.安全及可扩展的 Web 开发. 本教程将在 Visual Studio 提供 ...

  10. mysql参数innodb_flush_log_at_trx_commit

    查看mysql数据库innodb_flush_log_at_trx_commit : mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%'; ...