2011-06-22 50 views
2

我的問題是以下內容:我試圖建立一個函數,我可以傳遞一個項目列表,然後將這些項目與數據庫,並更新它們。我相信這個問題是在datacontexts的使用方式,但我不明白這個問題。LINQ to SQL submitchanges沒有做任何事情

這裏是我的功能是建立已更改的項目清單:

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    List<AFF_CMS_FMA> fmasToSave = new List<AFF_CMS_FMA>(); 
    AFF_CMS_FMA newFmaItem = new AFF_CMS_FMA(); 

    foreach (AFF_CMS_FMA fmaItem in FmaLib.fetchAllActiveAssetsInFMA()) 
    { 
     if (fmaItem.SortOrder != Convert.ToInt32(Request.Form["fmaItem_" + fmaItem.ID + "_SortOrder"])) 
     { 
      newFmaItem = fmaItem; 
      newFmaItem.Name = SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_Name"]); 
      newFmaItem.AssetID = Convert.ToInt32(Request.Form["fmaItem_" + fmaItem.ID + "_AssetID"]); 
      newFmaItem.SortOrder = Convert.ToInt32(Request.Form["fmaItem_" + fmaItem.ID + "_SortOrder"]); 
      newFmaItem.ImagePathEn = SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_ImagePathEn"]); 
      newFmaItem.ImagePathCh = SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_ImagePathCh"]); 
      newFmaItem.StartDate = DateTime.Parse(SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_StartDate"])); 
      newFmaItem.EndDate = DateTime.Parse(SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_EndDate"])); 
      newFmaItem.ClickToUrl = SecurityLib.SqlSafeString(Request.Form["fmaItem_" + fmaItem.ID + "_ClickToUrl"]); 
      fmasToSave.Add(newFmaItem); 

     } 
    } 
    FmaLib.saveEditedFmas(fmasToSave); 
} 

這裏就是foreach循環調用得到所有的都在DB項的功能:

public static List<AFF_CMS_FMA> fetchAllActiveAssetsInFMA() 
    { 
     List<AFF_CMS_FMA> results = null; 

     using (fmaDataContext db = new fmaDataContext()) 
     { 
      using (TransactionScope ts = new TransactionScope()) 
      { 
       try 
       { 
        if (HttpContext.Current.Cache["fmaActiveList"] == null) 
        { 
         db.LoadOptions = loadAll; 
         results = clsCompiledQuery.getAllActiveFmas(db).ToList(); 
         HttpContext.Current.Cache["fmaActiveList"] = results; 
        } 
        else 
         results = (List<AFF_CMS_FMA>)HttpContext.Current.Cache["fmaActiveList"]; 

        ts.Complete(); 
       } 
       catch (Exception ex) 
       { Transaction.Current.Rollback(); } 
      } 
      return results; 
     } 
    } 

這裏是正在使用的查詢:

protected static class clsCompiledQuery 
    { 
     public static Func<DataContext, IOrderedQueryable<AFF_CMS_FMA>> 
     getAllActiveFmas = CompiledQuery.Compile((DataContext db) 
     => from fma in db.GetTable<AFF_CMS_FMA>() 
      where fma.IsArchived == false 
      orderby fma.SortOrder ascending 
      select fma); 


     public static Func<DataContext, int,IQueryable<AFF_CMS_FMA>> 
     getFmaById = CompiledQuery.Compile((DataContext db, int ID) 
     => from fma in db.GetTable<AFF_CMS_FMA>() 
      where fma.ID == ID 
      select fma); 

    } 

,最後這個是我嘗試讓日E保存發生的分貝,但沒有產生的異常是throwns,但該數據庫不改變

public static bool saveEditedFmas(List<AFF_CMS_FMA> fmaToSaveList) 
    { 
     using (fmaDataContext db = new fmaDataContext()) 
     { 
      using (TransactionScope ts = new TransactionScope()) 
      { 
       try 
       { 
        foreach (AFF_CMS_FMA fmaItemToSave in fmaToSaveList) 
        { 
         AFF_CMS_FMA fmaItemToUpdate = clsCompiledQuery.getFmaById(db, fmaItemToSave.ID).ToList()[0]; 
         fmaItemToUpdate = fmaItemToSave; 

         db.SubmitChanges(); 
        } 

        return true; 
       } 
       catch (Exception ex) 
       { 
        Transaction.Current.Rollback(); 
        return false; 
       } 
      } 
     } 
    } 

我已經確認並表不包含在設計一個主鍵。如果我通過將datacontext傳遞給fetchAllActiveAssetsInFMA()來執行btnSave_click函數的保存,然後在該上下文中執行提交更改,它可以工作..但是我試圖從那裏抽象出它。

感謝所有提前

回答

2

你不是在函數調用saveEditedFmasts.Complete

另外我建議在for循環之外調用db.SubmitChanges();。爲什麼你有功能fetchAllActiveAssetsInFMA交易?它只是提取正確的數據?我不太確定保存函數for循環中發生了什麼,看起來很奇怪。

我想你應該在屬性映射從fmaItemToSavefmaItemToUpdate

foreach (var fmaItemToSave in fmaToSaveList) 
{ 
    var fmaItemToUpdate = clsCompiledQuery.getFmaById(db, fmaItemToSave.ID).First(); 
    fmaItemToUpdate.Name = fmaItemToSave.Name; 
    fmaItemToUpdate.AssetID = fmaItemToSave.AssetID; 
    //And the rest of the properties   
} 
db.SubmitChanges(); 
+0

都嘗試這些建議,什麼都沒有。感謝您的幫助 –

+0

save函數中for循環的內部看起來很奇怪,您不會更改任何對象的值。 – Magnus

+0

AFF_CMS_FMA fmaItemToUpdate = clsCompiledQuery.getFmaById(db,fmaItemToSave.ID).ToList()[0]; fmaItemToUpdate = fmaItemToSave;這兩行是將傳入的對象設置爲db上的對象。我從交易中取消了交易,你對這一交易是正確的。仍然同樣的結果,雖然 –