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. OC1_数组创建

    // // main.m // OC1_数组创建 // // Created by zhangxueming on 15/6/11. // Copyright (c) 2015年 zhangxuemi ...

  2. [ADO.NET]写入数据

    关键字:.NET,SQL SERVER,SQLBULKCOPY 插入一条数据的操作(SqlCmd). public void InsertOneIntoSourceDB() { if (DBConne ...

  3. 一种c#深拷贝方式完胜java深拷贝(实现上的对比)

    楼主是一名asp.net攻城狮,最近经常跑java组客串帮忙开发,所以最近对java的一些基础知识特别上心.却遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况.(实在是不想自己new ...

  4. 菜鸟的MySQL学习笔记(一)

    本学习笔记是照搬慕课网<与MySQL的零距离接触>内容,特此感谢! 1-1 mysql的安装与配置 Windows环境下的MSI安装: 1.安装: 双击MSI文件->用户协议-> ...

  5. 排序算法FIVE:插入排序InsertSort

    /** *插入排序思路:O(n^2) * 最外层一个循环,从第二个数到最后一个,变量为i * 每个数存储在key变量中 * 变量j,是左边已经排好序的数组的上限 * 判断key与前面每一个数比较 1, ...

  6. 关于.NET技术前途问题的讨论

    我去年曾经在论坛发起过关于.NET技术前途问题这个话题的讨论,也引起了很多同行和朋友的回复,时间过去大半年,自己也有了一些新的理解.本文的目的就是将其中一些精彩的观点整理出来并谈谈自己的观点. 引子 ...

  7. 根据版本的不同整理所有的绿色SQL Server

    在这篇论坛文章中,读者可以了解到如何根据不同的SQL Server版本,整理出所有版本的绿色SQL Server的具体方法,详细内容请参考下文: 1. Sqlservr.exe 运行参数 Sql Se ...

  8. Style 的优先级

    Dependency Property(简称DP)是WPF的核心,Style就是基于Dependency Property的,关于DP的内幕,请参见深入WPF--依赖属性.Style中的Setter就 ...

  9. MVC5添加控制器总是报“Multiple object sets per type are not supported”

    http://www.asp.net/mvc/tutorials/mvc-5/introduction/creating-a-connection-string 按照上面的指导做练习,  总报小面的错 ...

  10. 敏捷开发概述与路线(转自MBAlib)

    敏捷开发的概述 简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项 ...