.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 ...
随机推荐
- LeetCode(34):搜索范围
Medium! 题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果 ...
- 基于TCPCopy的仿真压测方案
一.tcpcopy工具介绍 tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信 ...
- Kafka动态增加Topic的副本
一.kafka的副本机制 由于Producer和Consumer都只会与Leader角色的分区副本相连,所以kafka需要以集群的组织形式提供主题下的消息高可用.kafka支持主备复制,所以消息具备高 ...
- linux常用软件安装,常用命令
jdk [root@localhost]# tar -zxvf jdk-8u144-linux-x64.tar.gz [root@localhost]# vi /etc/profile 在profil ...
- poj 1961 (求字符串中的重复子串)
Sample Input 3aaa12aabaabaabaab0Sample Output Test case #12 23 3 Test case #22 2 //aa有2个a6 2 //aabaa ...
- hdu 1596 乘积的最大值
一般题是 和的最小值 这个是乘积的最大值 Sample Input31 0.5 0.50.5 1 0.40.5 0.4 131 2 //起点 终点2 31 3 Sample Output0.5000. ...
- 状压dp-----三进制
三进制的状压dp要先预处理3^n以及每一个数的每一位 例题 hdu3001 题意: 给定n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2次. 题解: 看代码吧 ...
- python中简单文件的输入三种方式
最近在自学python,简单的总结了一下文件的输入的方式. 1. f=open("foo.txt") line=f.readline() while line: print(lin ...
- Environment error: “CodeBloks can't find compiler executable in your configured search path's for GNU GCC compiler”
codeblock安装后,提示cant find compiler executable in your configured search paths for GNU GCC Compiler 可能 ...
- 解决linux下“XX不在 sudoers 文件中。此事将被报告"的问题
在使用sudo命令时,经常性会提示出“不在 sudoers 文件中.此事将被报告”的错误信息. 这是因为当前登录的账号不在sudo权限里面. sudo命令可以让你以root身份执行命令,来完成一些我们 ...