LINQ to SQL: DataContext.SubmitChanges() 失效问题
當 DataContext (及其繼承類) 的 ObjectTrackingEnabled? = True(默認值)時:
1.如果用 DataContext 取出了某類(Tables)的實例對象,例如調用了First, FirstOrDefault, All, Last, LastOrDefault,...
2.那么,只要你對該對象的任何屬性(Property) 進行了賦值操作,DataContext 就自動跟蹤到這個動作。
3.此后,一旦調用 SubmitChanges() 就將這些改變保存到數據庫中去。
?
但是很不幸的是,DataContext 對對象的賦值操作和復制操作卻視而不見。
?
例如:
1.以下代碼,將程序執行更新操作時(在代碼中有Mark標記的分支),其后的dc.SubmitChanges()不會工作。
SimboxDataContext dc = new SimboxDataContext();
aspnet_User u = dc.aspnet_Users.First(c=>c.UserName==User.Identity.Name);
Messenger newMessenger = new Messenger();
newMessenger.UserID = u.UserId;
newMessenger.CurrentFlag = chkCurrentFlag.Checked;
int nTransmitLimit = 0;
int.TryParse(txtTransmitLimit.Text, out nTransmitLimit);
newMessenger.TransmitLimit = nTransmitLimit;
newMessenger.ModifiedDate = DateTime.Now;
Messenger originalMessenger = dc.Messengers.FirstOrDefault(c => c.UserID == u.UserId);
if (originalMessenger == null)
{
??? dc.Messengers.InsertOnSubmit(newMessenger);
}
else
{
??? originalMessenger = newMessenger; // Mark
}
dc.SubmitChanges();
?
2.必須將:
originalMessenger = newMessenger; // Mark
替換為:
//originalMessenger = newMessenger;
//originalMessenger.UserID = u.UserId;
originalMessenger.CurrentFlag = newMessenger.CurrentFlag;
originalMessenger.TransmitLimit = newMessenger.TransmitLimit;
originalMessenger.ModifiedDate = newMessenger.ModifiedDate;
?
我認為這個問題的影響不可小覷,因為,當我們將數據處理移去DAL(Data Access Lay),將這種業務邏輯移去BLL (Business Logic Layer) 后,傳來傳去的數據都是這種封裝后的對象。
偶正在探尋能夠解決或回避這個問題的方案,如有資料請Comment給我,謝謝先^_^
轉載于:https://www.cnblogs.com/SoulStore/archive/2008/11/27/1342320.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的LINQ to SQL: DataContext.SubmitChanges() 失效问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Step By Step在VS20
- 下一篇: 车已经买有近一个月了,技术也在提升中