LINQ to SQL: DataContext.SubmitChanges() 失效问题
2008-11-27 15:23
483 查看
当 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给我,谢谢先^_^
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给我,谢谢先^_^
相关文章推荐
- 同步DataContext,解决linq to sql更新数据的问题
- 一步一步学Linq to sql(二):DataContext与实体
- 一步一步学Linq to sql(二):DataContext与实体
- Linq to sql(二):DataContext与实体
- 一步一步学Linq to sql(二):DataContext与实体
- [转]一步一步学Linq to sql(二):DataContext与实体
- Difference between LINQ to SQL and LINQ to Entity(DataContext and DbContext)
- LINQ体验(16)——LINQ to SQL语句之DataContext
- LINQ体验(16)——LINQ to SQL语句之DataContext
- [导入]LINQ体验(16)——LINQ to SQL语句之DataContext
- 【转】一步一步学Linq to sql(二):DataContext与实体
- 一步一步学Linq to sql(二):DataContext与实体
- 一步一步学Linq to sql(二):DataContext与实体
- 一步一步学Linq to sql(二):DataContext与实体
- Linq to sql(二):DataContext与实体
- LINQ to SQL 之DataContext用法
- LINQ to SQL 之DataContext用法
- 一步一步学Linq to sql(二):DataContext与实体
- 【转】一步一步学Linq to sql(二):DataContext与实体
- LINQ to SQL and WCF - Sharing types, subverting the DataContext on the client side(转)