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
當關系為單向一對一關系時查詢是正常的,不會出現表聯查現象