zoukankan      html  css  js  c++  java
  • EF双向一对一中的坑

    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

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

    Top
    收藏
    关注
    评论
  • 相关阅读:
    【linux就该这么学】-05
    【linux就该这么学】-04
    【linux就该这么学】-03
    【linux就该这么学】-02
    【linux就该这么学】-01
    【linux就该这么学】-00
    MySQL57安装与设置
    Docker(一) Docker入门教程
    Centos 7.X 安装及常规设置
    删除数组里所有与给定值相同的值
  • 原文地址:https://www.cnblogs.com/yujiajun/p/EFOneToOneRelation.html
Copyright © 2011-2022 走看看