.NetCore中EFCore的使用整理(二)-关联表查询
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);
}

更多 :
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的使用整理(二)-关联表查询的更多相关文章
- .NetCore中EFCore for MySql整理(二)
一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...
- .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql
一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...
- .NetCore中EFCore的使用整理(三)-关联表操作
一.查询关联表数据 StudyAboard_TestContext _context = new StudyAboard_TestContext(); CrmRole role = _context. ...
- .NetCore中EFCore for MySql整理
一.MySql官方提供了Ef Core对MySql的支持,但现在还处于预览版 Install-Package MySql.Data.EntityFrameworkCore -Pre Install-P ...
- .NetCore中EFCore的使用整理
EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术. 其中的.NetCore版本对应EntityFrameworkCore Git源代码地址:https://git ...
- Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...
- 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案
1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...
- SpringBoot Data JPA 关联表查询的方法
SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店 ...
- 百万年薪python之路 -- MySQL数据库之 MySQL行(记录)的操作(二) -- 多表查询
MySQL行(记录)的操作(二) -- 多表查询 数据的准备 #建表 create table department( id int, name varchar(20) ); create table ...
随机推荐
- xpath定位
XML 实例文档 我们将在下面的例子中使用这个 XML 文档. <?xml version="1.0" encoding="ISO-8859-1"?> ...
- STM32F412应用开发笔记之九:移植FreeRTOS到F412ZG平台
在开发实际应用系统时,我们经常需要考虑数据的实时性和多任务,嵌入式实时操作系统的出现为实现这一目的提供了很好的助力.FreeRTOS是近年来比较流行的嵌入式实时操作系统,而且是开源免费的,STM32C ...
- vue2进阶之v-model在组件上的使用
v-model 用在 input 元素上时 v-model虽然很像使用了双向数据绑定的 Angular 的 ng-model,但是 Vue 是单项数据流,v-model 只是语法糖而已: <in ...
- Optimization algorithm----Deep Learning
深度学习中的优化算法总结 以下内容简单的汇总了在深度学习中常见的优化算法,每个算法都集中回答:是什么?(原理思想)有什么用?(优缺点)怎么用?(在tensorflow中的使用) 目录 1.SGD 1. ...
- php文件路径获取文件名
物理截取: $file = '/www/htdocs/inc/lib.inc.php'; $filename = basename($file); echo $filename, '<br/&g ...
- PowerDesigner表创建脚本双引号问题
在使用PowerDesigner表属性的Preview查看创建脚本的时候,发现大多表名和字段名都加上了双引号,而且有引号的都是大小写混合的,导致创建的表里,表名和字段名也都是大小写混合的. 在一番搜索 ...
- AOJ 2170 Marked Ancestor[并查集][离线]
题意: 给你一颗N个节点的树,节点编号1到N.1总是节点的根.现在有两种操作: M v: 标记节点v Q v: 求出离v最近的标记的相邻节点.根节点一开始就标记好了. 现在给一系列操作,求出所有Q操作 ...
- python下载文件的方法
前一段时间是爬文字,最近准备爬图片 找到了两种保存文件的方法 一种是用urllib.urlretrieve方法 #-*- coding: utf-8 -*- import urllib def cal ...
- 三步解决阿里云绑定公网IP地址失败解决方案
1.客户端设置为阿里云服务器的公有地址: 2.服务端设置为阿里云服务器的私有地址: 3.设置阿里云的管理规则: 第一步 第二步 第三.四步
- File的方法
1.介绍 file 对象使用 open 函数来创建. 2.常用的方法