• 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
    收藏
    关注
    评论
  • 相关阅读:
    WSGI详解
    WSGI、flup、fastcgi、web.py的关系
    全面解读python web 程序的9种部署方式
    python对web服务器做压力测试并做出图形直观显示
    6个最佳的开源Python应用服务器
    用 Python 脚本实现对 Linux 服务器的监控
    浅谈图片服务器的架构演进
    Python中使用Flask、MongoDB搭建简易图片服务器
    流行python服务器框架
    搜索引擎技术之概要预览
  • 原文地址:https://www.cnblogs.com/yujiajun/p/EFOneToOneRelation.html
Copyright © 2020-2023  润新知