2011-06-22 3 views
2

私の問題は次のとおりです。私はアイテムのリストを渡すことができる関数を作成しようとしています。私は問題がdatacontextsが使用されている方法の範囲内だと思うが、私はこの問題を把握することはできません。ここでLINQ to SQLのサブミットが何もしない

が変更されたアイテムのリストを作成し、私の関数である。ここで

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); 

    } 

、最終的にはこれが目を取得するイムしようとしていました電子デシベルに起こるために保存して、何のexeptionsはthrownsません、まだDBは

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; 
       } 
      } 
     } 
    } 

私がチェックして変更しないと、テーブルには、デザイナーの主キーが含まれていません。私がfetchAllActiveAssetsInFMA()にdatacontextを渡すことによってbtnSave_click関数からの保存を行うと、そのコンテキストでサブチェンジを実行しますが、そこから抽象化しようとしています。すべて事前に

おかげ

答えて

2

あなたが機能saveEditedFmasts.Completeを呼び出していません。

また、db.SubmitChanges();をforループの外に呼び出すことをおすすめします。そして、あなたはなぜ機能のトランザクションを持っていますかfetchAllActiveAssetsInFMA?それはデータの取り出しだけです?そして私は、save関数のforループの内部で何が起こっているのかよく分からない。

は、私はあなたがfmaItemToSaveからこれらの提案の両方を試してみましたfmaItemToUpdate

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;これら2つの行は、渡されたオブジェクトをdbに相当するオブジェクトに設定しています。私はそのことについてあなたが正しかったフェッチからトランザクションを削除しました。まだ同じ結果です –