【问题标题】:LINQ to SQL submitchanges not doing anythingLINQ to SQL submitchanges 没有做任何事情
【发布时间】:2011-06-23 04:23:54
【问题描述】:

我的问题如下:我正在尝试构建一个函数,我可以将项目列表传递给该函数,然后将这些项目中的每一个转到数据库并更新它们。我相信问题出在使用数据上下文的方式之内,但我无法弄清楚这个问题。

这是我构建已更改项目列表的函数:

 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 循环调用以获取数据库中所有项目的函数:

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

    }

最后这是我试图让保存发生在数据库上,但没有抛出异常,但数据库没有改变

 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 函数进行保存,然后在该上下文上执行 submitchanges 它可以工作..但我试图从那里抽象出来。

提前谢谢大家

【问题讨论】:

    标签: c# .net asp.net linq linq-to-sql


    【解决方案1】:

    您没有在函数saveEditedFmas 中调用ts.Complete

    我还建议在 for 循环之外调用 db.SubmitChanges();。为什么你在函数fetchAllActiveAssetsInFMA中有一个事务?它只是获取数据对吗?而且我不太确定保存函数中的 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();
    

    【讨论】:

    • 尝试了这两个建议,没有。感谢您的帮助
    • 保存函数中for循环的内部看起来很奇怪,你没有改变对象的任何值。
    • AFF_CMS_FMA fmaItemToUpdate = clsCompiledQuery.getFmaById(db, fmaItemToSave.ID).ToList()[0]; fmaItemToUpdate = fmaItemToSave;这两行将传入的对象设置为 db 上的等效对象。我从 fetch 中删除了该交易,您对那笔交易是正确的。还是一样的结果
    • 我认为你应该将属性从 fmaItemToSave 映射到 fmaItemToUpdate
    • 也不要使用.ToList()[0],而是使用.First(),看起来更好
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多