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

當關系為單向一對一關系時查詢是正常的,不會出現表聯查現象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM