EF版本 6.0

在项目中双向一对一关系是普遍存在的,如果不仔细检查,并不容易发现这个坑

下面新建两个类(假设这两个类是一对一的关系)对应实体都设置为可延迟加载

映射关系为:

再建一个数据访问类:

运行下面查询语句:

TestContext db = new TestContext();

 var list = db.QuerySchool.ToList();

正常情况下,生成的查询语句应该只查询SchoolInfo表,但是生成sql语句却是这样:

SELECT

    [Extent1].[Sid] AS [Sid],

    [Extent1].[SchoolName] AS [SchoolName],

    [Extent2].[Id] AS [Id]

    FROM  [dbo].[SchoolInfo] AS [Extent1]

    LEFT OUTER JOIN [dbo].[ClassInfo] AS [Extent2] ON [Extent1].[Sid] = [Extent2].[SchoolId]

进行了一个表联查,明明没有查询ClassInfo表这里却进行了关联(问题1)

下面修改下查询语句

var list = db.QuerySchool.Select(x => new { SId = x.Sid, SchoolName = x.SchoolName }).ToList();

只查询出ID和SchoolName,生成sql语句如下:

SELECT

    [Extent1].[Sid] AS [Sid],

    [Extent1].[SchoolName] AS [SchoolName]

    FROM [dbo].[SchoolInfo] AS [Extent1]

这次却是正常的

现在查询ClassInfo表:

var list = db.QueryClass.ToList();

生成sql语句如下:(问题2)

SELECT

    [Extent1].[Id] AS [Id],

    [Extent1].[SchoolName] AS [SchoolName],

    [Extent1].[ClassName] AS [ClassName],

    [Extent1].[SchoolId] AS [SchoolId]

    FROM [dbo].[ClassInfo] AS [Extent1]

可以看到SQL语句并未像SchoolInfo表一样出现表联查语句

疑问:

HasRequired(x => x.School).WithRequiredDependent(x => x.ClassInfo).Map(map => map.MapKey("SchoolId")).WillCascadeOnDelete(true);

ClassInfo必须有SchoolInfo,SchoolInfo又依赖ClassInfo,二者是生死存亡的关系,缺一不可,可是这样无法解释问题1和问题2

当关系为单向一对一关系时查询是正常的,不会出现表联查现象

EF双向一对一中的坑的更多相关文章

  1. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  2. Hibernate5.2关联关系之双向一对多(三)

                                                           Hibernate之双向一对多(三) 一.简介 本篇博文接着上一章的内容接着开展,代码也是 ...

  3. hibernate 自生双向一对多 多对一管理 (树)

    <span style="font-size: large;">package com.javacrazyer.test; import java.io.Seriali ...

  4. 8、双向一对多的关联关系(等同于双向多对一。1的一方有对n的一方的集合的引用,同时n的一方有对1的一方的引用)

    双向一对多关联关系 “双向一对多关联关系”等同于“双向多对一关联关系”:1的一方有对n的一方的集合的引用,同时n的一方有对1的一方的引用. 还是用客户Customer和订单Order来解释: “一对多 ...

  5. JPA学习笔记(8)——映射双向一对多关联关系

    双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...

  6. Hibernate 双向一对多的关联映射

    双向的一对多的关联关系是单项的一对多和单项的多对一的情况下产生的. 1.设计表结构 虽然关联关系变为双向的一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建student对象 3.创建Gra ...

  7. hibernate中配置单向多对一关联,和双向一对多,双向多对多

    什么是一对多,多对一? 一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多 多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是 ...

  8. 测试开发专题:spring-boot如何使用JPA进行双向一对多配置

    本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置. 依赖准备 要在spring-boot使用jpa需要在项目中有进入相关的依赖,pom文件里加入下面内容 & ...

  9. EF Join连接查询的坑

    最近做项目的时候遇到一个需要级联查询的数据,表中又没有定义相关的外键约束,所以限定了咱们只能使用Join方式的关联而不是Include的方式关联,关于Include和Join的详细用法,本屌就不再此处 ...

随机推荐

  1. javascript学习笔记20160121-css选择器

    元素可以用id.标签名或类来描述: 更一般的,元素可以基于属性来选取: 这些基本的选择器可以组合使用: 选择器可以指定文档结构(重要,之前一直不太明白>的使用): 选择器可以组合起来选取多个或多 ...

  2. ceilometer

    控制节点: ceilometer-api: /etc/init.d/openstack-ceilometer-api  status ceilometer-collector /etc/init.d/ ...

  3. CentOS7 firewall的使用

    # 查看区域 firewall-cmd --get-zones # 查看默认区域 firewall-cmd --get-default-zone # 给区域添加永久性服务 firewall-cmd - ...

  4. Linux 系统结构详解

    Linux 系统结构详解 Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统 ...

  5. 青瓷qici - H5小游戏 抽奖机 “one-arm bandit”

    写在前面 本文实现一个简单的抽奖效果,使用青瓷qici引擎,其中应用了Tween动画,粒子系统,遮罩,UI界面布局,项目设置,发布等功能呢. 目前开发采用1.0.7版本,后续如果界面有所变化请参考这个 ...

  6. php使用phpmailer发送邮件

    本人新手,由于要做邮件发送验证码,所以找到和搜集到这些,本人亲测完全可以用 这是163邮箱的   因为不是企业邮箱填写的账号是163的账号,但是密码是授权码 授权码的获取方式为:

  7. Maven插件实现的autoconfig机制(转)

    autoconfig这种机制在软件开发和发布的过程中是非常方便也是非常必要的一种动态替换配置信息的一种手段,一种很贴切的比喻:这个就像在windows下面安装一个软件时,我们按照安装向导给我们弹出提示 ...

  8. python上下文管理器及with语句

    with语句支持在一个叫上下文管理器的对象的控制下执行一系列语句,语法大概如下: with context as var: statements 其中的context必须是个上下文管理器,它实现了两个 ...

  9. MVC-列表页操作按钮调用脚本

    如上图所示功能:点击右边的“编辑”和“重置按钮”,调用js实现弹出框功能. 1.写脚本: <script type="text/javascript"> functio ...

  10. entity framework in mysql

    To start using Entity Framework 6 and Visual Studio 2013 is necessary to install MySQL for Visual St ...