C# LINQ到SQL提交更改不执行任何操作

C# LINQ到SQL提交更改不执行任何操作,c#,.net,asp.net,linq,linq-to-sql,C#,.net,Asp.net,Linq,Linq To Sql,我的问题如下:我正在尝试构建一个函数,我可以向它传递一个项目列表,然后将这些项目中的每一个项目发送到db并更新它们。我相信这个问题在DataContext的使用方式中,但我无法解决这个问题 以下是我的函数,用于生成已更改项目的列表: protected void btnSave_Click(object sender, EventArgs e) { List<AFF_CMS_FMA> fmasToSave = new List<AFF_CMS_FMA>();

我的问题如下:我正在尝试构建一个函数,我可以向它传递一个项目列表,然后将这些项目中的每一个项目发送到db并更新它们。我相信这个问题在DataContext的使用方式中,但我无法解决这个问题

以下是我的函数,用于生成已更改项目的列表:

 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);
}
protectedvoidbtnsave\u单击(对象发送方,事件参数e)
{
List fmasToSave=新列表();
AFF_CMS_FMA newFmaItem=新AFF_CMS_FMA();
foreach(在FmaLib.fetchallactiveasetsinfma()中的AFF_CMS_FMA fmaItem)
{
if(fmaItem.SortOrder!=Convert.ToInt32(Request.Form[“fmaItem”+fmaItem.ID+“\u SortOrder]”)
{
newFmaItem=fmaItem;
newFmaItem.Name=SecurityLib.SqlSafeString(Request.Form[“fmaItem_”+fmaItem.ID+“_Name]”);
newFmaItem.AssetID=Convert.ToInt32(Request.Form[“fmaItem_25;”+fmaItem.ID+“AssetID”);
newFmaItem.SortOrder=Convert.ToInt32(Request.Form[“fmaItem”+fmaItem.ID+“\u 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+”);
newFmaItem.EndDate=DateTime.Parse(SecurityLib.SqlSafeString(Request.Form[“fmaItem”+fmaItem.ID+“\u EndDate”));
newFmaItem.ClickToUrl=SecurityLib.SqlSafeString(Request.Form[“fmaItem”+fmaItem.ID+“\u 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;
        }
    }
公共静态列表fetchallactiveasetsinfma()
{
列表结果=空;
使用(fmaDataContext db=new fmaDataContext())
{
使用(TransactionScope ts=new TransactionScope())
{
尝试
{
if(HttpContext.Current.Cache[“fmaaactivelist”]==null)
{
db.LoadOptions=loadAll;
结果=clsCompiledQuery.getAllActiviefMas(db.ToList();
HttpContext.Current.Cache[“fmaaActiveList”]=结果;
}
其他的
结果=(列表)HttpContext.Current.Cache[“fmaActiveList”];
ts.完成();
}
捕获(例外情况除外)
{Transaction.Current.Rollback();}
}
返回结果;
}
}
以下是正在使用的查询:

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

    }
受保护的静态类clsCompiledQuery
{
公共静态函数
getAllActiveFmas=CompiledQuery.Compile((DataContext db)
=>来自db.GetTable()中的fma
其中fma.IsArchived==false
orderby fma.SortOrder升序
选择fma);
公共静态函数
getFmaById=CompiledQuery.Compile((DataContext db,int ID)
=>来自db.GetTable()中的fma
其中fma.ID==ID
选择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;
                }
            }
        }
    }
publicstaticboolsaveeditedfmas(List-fmaToSaveList)
{
使用(fmaDataContext db=new fmaDataContext())
{
使用(TransactionScope ts=new TransactionScope())
{
尝试
{
foreach(AFF_CMS_FMA FMAITEMTOS保存在fmaToSaveList中)
{

AFF_CMS_FMA fmaItemToUpdate=clsCompiledQuery.getFmaById(db,fmaItemToSave.ID).ToList()[0]; fmaItemToUpdate=fmaItemToSave; db.SubmitChanges(); } 返回true; } 捕获(例外情况除外) { Transaction.Current.Rollback(); 返回false; } } } }
我已经检查过了,表中确实包含设计器中的主键。如果我通过将datacontext传递给FetchAllActiviesSetSinfma()来执行btnSave_click函数的保存,然后在该上下文上执行submitchanges,则它会工作。。但我试图从那里抽象出来


提前感谢您没有调用
ts.Complete
函数
saveEditedFmas

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

尝试了这两个建议,什么都没有。感谢您的帮助save函数中for循环的内部看起来很奇怪,您没有更改对象的任何值。AFF_CMS_FMA fmaItemToUpdate=clsCompiledQuery.getFmaById(db,fmaItemToSave.ID)。ToList()[0];fmaItemToUpdate=fmaItemToSave;这两行设置传入的对象在db上的等效对象。我从fetch中删除了该事务。你在这一点上是对的。虽然我认为应该将属性从fmaItemToSave映射到fmaitemtoupdate,但结果仍然相同。也不要使用
。ToList()[0]
使用
。First()
看起来更好