linq更新部分数据时遇到的问题及解决办法
2013-01-28 20:59
465 查看
问题:因为每次更新的时候只是某个类的一部分,但是这个类的属性比较多.
更新函数如下
这时候产生的sql如下
问题就是这样做会将你没有符过值的都更新为Null,我继续做实验,将main函数改为如下
会引发"已尝试 Attach 或 Add 实体,该实体不是新实体,可能是从其他 DataContext 中加载来的。不支持这种操作。"异常,没找到把n1从它的DataContext脱离的办法.所以我使用如下的解决方案:
在log的部分类中书写克隆方法:
生成的sql语句如下
感觉这个Clone()方法也不是好的解决方案,大家有什么好的想法么?
网友:@Gray Zhang 的这个方法我觉得不错,整理如下:
更新函数如下
static void updateRe(log n) { using (DataClasses1DataContext dc = new DataClasses1DataContext()) { using (StreamWriter sw=new StreamWriter("t.log")) { dc.Log = sw; dc.log.Attach(n); dc.Refresh(RefreshMode.KeepCurrentValues,n); dc.SubmitChanges(); } } } staticvoidMain(string[]args) { logn1=newlog(); n1.logId=1; n1.logMessage="xxxx"; updateRe(n1); }
这时候产生的sql如下
SELECT [t0].[logId], [t0].[logMessage], [t0].[x] FROM [dbo].[log] AS [t0] WHERE [t0].[logId] = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] UPDATE [dbo].[log] SET [logMessage] = @p1, [x] = @p2 WHERE [logId] = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input VarChar (Size = 4; Prec = 0; Scale = 0) [xxxx] -- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [Null]
问题就是这样做会将你没有符过值的都更新为Null,我继续做实验,将main函数改为如下
staticvoidMain(string[]args) { DataClasses1DataContextdc=newDataClasses1DataContext(); logn1=(fromxindc.log selectx).SingleOrDefault(c=>c.logId==1); n1.logMessage="xxxy"; updateRe(n1); }
会引发"已尝试 Attach 或 Add 实体,该实体不是新实体,可能是从其他 DataContext 中加载来的。不支持这种操作。"异常,没找到把n1从它的DataContext脱离的办法.所以我使用如下的解决方案:
在log的部分类中书写克隆方法:
publicpartialclasslog { publiclogClone() { logl=newlog(); l.logId=this.logId; l.logMessage=this.logMessage; l.x=this.x; returnl; } } staticvoidMain(string[]args) { DataClasses1DataContextdc=newDataClasses1DataContext(); logn1=((fromxindc.log selectx).SingleOrDefault(c=>c.logId==1)).Clone(); n1.logMessage="xxxy"; updateRe(n1); }
生成的sql语句如下
SELECT [t0].[logId], [t0].[logMessage], [t0].[x] FROM [dbo].[log] AS [t0] WHERE [t0].[logId] = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] UPDATE [dbo].[log] SET [logMessage] = @p1 WHERE [logId] = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input VarChar (Size = 4; Prec = 0; Scale = 0) [xxxy]
感觉这个Clone()方法也不是好的解决方案,大家有什么好的想法么?
网友:@Gray Zhang 的这个方法我觉得不错,整理如下:
staticvoidUpdate(intid,Action<log>updater) { using(DataClasses1DataContextctx=newDataClasses1DataContext()) { ctx.Log=Console.Out; logentity=ctx.log.First(c=>c.logId==id); //执行updater updater(entity); ctx.SubmitChanges(); } } publicstaticvoidset(logl) { l.logMessage="xxtx"; } staticvoidMain(string[]args) { Update(1,set); }
相关文章推荐
- linq更新部分数据时遇到的问题及解决办法
- 使用Linq 更新数据库时遇到的一些问题及解决办法
- 使用Linq 更新数据库时遇到的一些问题及解决办法
- Android开发遇到的各种问题的解决办法(不断更新!!!)
- 关于SDK更新遇到Failed to fetch URL http://dl-ssl.google.com/android refused问题的解决办法
- 更新Ubuntu Kylin源遇到问题的解决办法
- 项目适配iOS9遇到的一些问题及解决办法(持续 c0f3 更新)
- 关于android开发遇到的一些问题的解决办法---间断的更新
- 同步DataContext,解决linq to sql更新数据的问题
- 第三周作业:程序模块开发遇到的问题及部分解决办法
- 项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)
- linq更新数据冲突问题解决
- Oracle数据导出遇到的问题及解决的办法
- DataGridView多线程更新数据的问题的解决办法
- Caffe搭建:常见问题解决办法和ubuntu使用中遇到问题解决方法(持续更新)
- 关于CListCtrl控件更新Item的闪烁问题和一次插入大容量数据的显示问题解决办法
- Android Studio 离线更新遇到的问题及部分解决方式
- APP打包遇到的问题和解决办法总结 <待更新>
- Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法