2011-01-14 48 views
0

我有一個有趣的問題。LINQ to SQL:DataContext.SubmitChanges不立即更新

做DataContext.SubmitChanges()以一種方式更新Count(),但不在另一種方式,請參閱下面的代碼中的我的評論。
(DC是DataContext)

Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName); 
    DataCompliance compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 

    if (compliances.Count() == 0) // Insert if not exists 
    { 
    DC.DataCompliances.InsertOnSubmit(new DataCompliance { 
     FKCompany = c.Id, 
     FKComplianceCriteria = criteria.Id 
    }); 
    DC.SubmitChanges(); 

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 

    // At this point DC.DataCompliances.Count() has increased, 
    // but compliances.Count() is still 0 
    // When I refresh the page however, it will be 1 
    } 

爲什麼會發生這種情況?

我需要在插入一個後立即更新compliances。有沒有人有辦法解決嗎?

回答

4

將對象添加到數據上下文(並將其傳播回數據庫)並將其添加到您從數據庫中檢索到的對象的關聯實體集合之間是有區別的。一旦檢索到對象及其關聯的實體,對數據庫中的數據進行更改將不會反映到檢索到的對象中,因爲數據庫不是必需的。關鍵位是公司的SingleOrDefault() - 強制執行查詢並分配檢索的數據。枚舉關聯的實體將導致它們在未被加載的情況下被加載。因此,即使在更新數據庫之後,以前檢索到的對象也不會反映更新。但是,您可以將插入的對象添加到公司的數據合規性集合中,然後進行更新,這將成爲您的期望。請注意,我認爲您仍然需要分配您在支票中使用的關聯實體。刷新頁面也解決了這個問題,因爲數據是從數據庫中重新查詢的,更新了關聯的實體集合以及數據上下文中的表格。

Company c = DC.Companies.SingleOrDefault(x => x.Name == companyName); 
var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 

if (compliances.Count() == 0) // Insert one if not exist yet 
{ 
    c.DataCompliances.Add(new DataCompliance 
    { 
     ComplianceCriteria = criteria 
    }); 
    DC.SubmitChanges(); 

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 
} 

原始(左爲上下文)

如果你嘗試分配相關的實體,而不只是它的ID?我相信分配id實際上並不會填充正在檢查的關聯實體,而SubmitChanges只是將數據傳播回數據庫,而不是實際更新包含關聯實體數據的表元素。

var compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 

if (compliances.Count() == 0) // Insert one if not exist yet 
{ 
    DC.DataCompliances.InsertOnSubmit(new DataCompliance { 
     FKCompany = c.Id, 
     ComplianceCriteria = criteria 
    }); 
    DC.SubmitChanges(); 

    compliances = c.DataCompliances.Where(x => x.ComplianceCriteria.FKElement == e.Id); 
} 
+0

不,這不是問題的定義。它將正確的數據插入到數據庫中。但是,謝謝! – Aximili 2011-01-14 03:53:27

+0

@aximili - 是的,但它會但我認爲它實際上並沒有從數據庫中檢索相關的實體。您的where子句引用此實體,因此新元素從篩選集合中省略。 – tvanfosson 2011-01-14 03:55:19

1

更改c.DataCompliances.Where...DC.DataCompliances.Where...

DC是數據背景下,什麼是c