2011-08-29 39 views
0

我遇到了實體框架未持久更改數據庫的問題。我使用靜態方法來加載一些值,並且Entity上下文被扔掉(在using語句中)。在實體框架中持續進行的WPF更改

然後將對象加載到WPF DataGrid中,供最終用戶操作。

當用戶完成更改時,按下「更新」按鈕並將對象列表發送回數據層以保存到數據庫。我可以看到在UI中更改的對象反映了它們的新值(即不是數據綁定問題)。

我會假設,因爲加載對象的實體上下文已經被處理掉了,我應該把這些對象附加到新創建的上下文中。正確?當我這樣做時,修改對象的實體狀態(我可以看到這是狀態設置)變爲「未更改」。數據庫沒有任何內容。

我錯過了什麼?

這裏是加載和更新值碼:

public static List<SSIS_Configuration> GetConfigurationValuesForTenant(string tenantKey, SqlConnectionString connectionString) 
    { 
     List<SSIS_Configuration> configStrings = new List<SSIS_Configuration>(); 
     if (connectionString.IsValid()) 
     { 
      try 
      { 

       using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework"))) 
       { 
        string configFilterStartingValue = "CommonConfig_" + tenantKey; 

        configStrings = (from configString in entities.SSIS_Configurations 
            where configString.ConfigurationFilter.StartsWith(configFilterStartingValue) 
            select configString).ToList(); 
       } 
      } 
      catch { } 
     } 

     return configStrings; 
    } 

    public static void UpdateConfigurations(List<SSIS_Configuration> configurations, SqlConnectionString connectionString) 
    { 
     if (connectionString.IsValid()) 
     { 
      try 
      { 
       using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework"))) 
       { 
        foreach (SSIS_Configuration config in configurations) 
        { 
         entities.Attach(config); 
        } 

        entities.SaveChanges(); 
       } 
      } 
      catch { } 
     } 
    } 
+1

嘗試在App.Current.Properties [「context」]之類的位置保持上下文。除非它們是自我跟蹤實體,否則即使您附加使用新的上下文,也不會注意到這些更改。 –

+1

我的首選是將我的上下文保存在Unity等IoC容器中。然後我可以設置參數來控制生命週期。然後可以使用構造器注入來確保所有視圖模型都可以訪問上下文對象。 – Winger

+0

@Dustin,我不知道這是否適合我的解決方案,因爲此代碼存儲在類庫中以供不同的終端UI解決方案使用。雖然主要用於Windows WPF客戶端,但它很可能會被控制檯應用程序和Silverlight應用程序使用。 App.Current何時可用? –

回答

1

WPF應用場景對於連接實體,因此你不能處置情況下,如果你要改變從上下文加載的實體。如果你處理它,你必須實現許多額外的邏輯,因爲你必須告訴用戶對實體和關係做了一個新的上下文關於every single change

因此,在您的場景中,調用Attach將僅將實體連接到上下文,但是you need to set also their state(將放置實體附加到Unchanged狀態)。請注意,根據您要執行的操作,您必須正確設置Modified,DeletedInserted的狀態。如果您的變更實體有一些關係也發生了變化,您也必須爲相關實體設置狀態,如果實體間關係發生變化,您也必須自行更改關係狀態。

+0

我想指出,我原來的問題沒有包括這段代碼,但我試過這個,但它仍然沒有工作。對象會從視圖層返回,我將它們全部設置爲已修改,但仍不會更新。我發現我的問題與底層數據對象相反。這是一個看法,但我沒有得到一個錯誤,告訴我無法執行更新。在我的一個配置中,我能夠產生這個錯誤,現在已經認爲我必須通過存儲過程更新數據。 –