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. JS的浅拷贝与深拷贝

    浅拷贝 //这样的拷贝有一个问题.那就是,如果父对象的属性等于数组或另一个对象,//那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能. function exten ...

  2. Laravel Cache 的缓存文件在到期后是否会自动删除

    验证缓存文件是否会自动删除的目的是,防止产生大量的缓存文件,占满磁盘.因为,我最近越来越多的使用 cache 来缓存各类 token. 使用的是 file 作为 CACHE_DRIVER CACHE_ ...

  3. 用PNChart绘制折线图

    写在前面 上一篇文章已经介绍过用PNChart绘制饼状图了,绘制折线图的步骤和饼状图的步骤是相似的,按照中的准备做好准备工作后就可以绘制折线图了. 开始使用 1.在view中声明一个PNLineCha ...

  4. 使用siege执行压力测试

    没有安装siege? 可参考我的另一篇博客 使用siege执行压力测试笔记 场景分析 使用siege对https://www.baidu.com/进行加压. 要求 模拟20个用户同时访问 一共跑3个循 ...

  5. 《剑指offer》-表示数值的字符串

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1416&q ...

  6. 【Algorithm | 链表】单链表“环”、“环的起点”、“环的长度”问题

    参考资料 • Floyd判圈算法 { 链接 } • 单链表“环”.“环的起点”.环的长度”问题 { 链接 } 链表环的问题 一.判断链表有换 使用两个指针slow和fast.两个指针开始时均在头节点处 ...

  7. 利用mysqldump 实现每天备份方案

    1.创建单独的导出导入数据库帐号 grant SELECT, RELOAD, SHOW DATABASES, LOCK TABLES on game to jackluo@localhost iden ...

  8. [HEOI2016/TJOI2016]序列

    题解: 很水的题目 首先容易发现每个位置实际上只有最大值是有用的 然后把条件变成dp[i]=max(dp[j]+1)(j<i,F[i]>G[j],G[i]>H[j]) 然后我研究了一 ...

  9. C#编码、解码

    1.HttpUtility.UrlEncode 方法: 对 URL 字符串进行编码,以便实现从 Web 服务器到客户端的可靠的 HTTP 传输.重载列表: [1]将字节数组转换为已编码的 URL 字符 ...

  10. 【AtCoder】Tenka1 Programmer Contest

    C - 4/N 列出个方程枚举解一下 #include <bits/stdc++.h> #define fi first #define se second #define pii pai ...