2013-04-03 122 views
0

就像標題所說,當我添加的孩子現有的父,所有現有的兒童進行檢索。增加孩子現有的父檢索所有現有兒童

減少/簡化父母和孩子機型:

public class ProjectLocalisation 
{ 
    public int ProjectID { get; set; } 

    public virtual Project Project { get; set; } 

    public virtual ICollection<ProjectImage> Images { get; set; } 
} 

public class ProjectImage 
{ 
    [Key] 
    public int ID { get; set; } 

    public int ProjectID { get; set; } 

    public virtual ProjectLocalisation ProjectLocalisation { get; set; } 
} 
  • 在創建新的孩子一個新的父,那麼除了該 實際插入在數據庫上完成。
  • 當編輯現有的父無需添加新的孩子,但 編輯現有的孩子,除了沒有實際更新數據庫上進行 。
  • 當編輯現有的父和增加新的孩子,所有現有的 孩子都從數據庫中檢索。

通過創建類的新實例,設置主鍵和附加對象來完成編輯現有父對象。那一刻此行被執行:執行

projectLocalisation.Images.Add(image); 

此查詢:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[ProjectID] AS [ProjectID], 
[Extent1].[Name] AS [Name], 
[Extent1].[Order] AS [Order], 
[Extent1].[LanguageTag] AS [LanguageTag] 
FROM [dbo].[ProjectImages] AS [Extent1] 
WHERE ([Extent1].[ProjectID] = @EntityKeyValue1) AND ([Extent1].[LanguageTag] = @EntityKeyValue2)',N'@EntityKeyValue1 int,@EntityKeyValue2 nvarchar(128)',@EntityKeyValue1=5,@EntityKeyValue2=N'nl' 

有什麼辦法禁用此行爲?


編輯:一種解決方法似乎是不會使收集虛擬的,但我寧可不使用.Include()所有的地方。

回答

2

這看起來像延遲加載。關閉延遲加載,當你不需要它(或當你不希望它)通過調用:

dbContext.Configuration.LazyLoadingEnabled = false; 
+0

我很困惑,爲什麼EF決定它需要加載所有現有的數據。像這樣禁用延遲加載似乎有訣竅。 – Stijn

+2

英孚不做任何決定。這是爲支持延遲加載而生成的代理類的一個特性(它在內部要求EF加載數據)。該類簡單地覆蓋您的屬性並確保首次訪問導航屬性將加載所有數據。添加到收藏仍然是一個訪問。 –

+0

啊,然後懶惰的加載工作稍微不同於我原來的想法。感謝您的額外信息。 – Stijn

0

你可以嘗試從這種關係中,例如另一端添加圖像

db.ProjectImages.Add(new ProjectImage { ProjectLocalisation = localisation, ... } 
相關問題