C# LINQ到SQL提交更改不执行任何操作
我的问题如下:我正在尝试构建一个函数,我可以向它传递一个项目列表,然后将这些项目中的每一个项目发送到db并更新它们。我相信这个问题在DataContext的使用方式中,但我无法解决这个问题 以下是我的函数,用于生成已更改项目的列表: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>();
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()
看起来更好