Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法

Linq to Sql中,如果我们想在DataContext外部修改一个实体的值,然后把引用传入到DataContext中,再利用Attach附加后更新,代码如下:

public static void UpdateMyTable(myData _pDate)
{
    using (dbUserDataContext db = new dbUserDataContext(Website.ConnStrdbUser))
    {
    try
    {
        db.myData.Attach(_pDate, db.myData.Single(c => c.ID == _pDate.ID));//将会出异常:“不能添加其键已在使用中的实体。”
        
        db.SubmitChanges();
    }
    catch { }
    finally { db.Connection.Close(); }
    }
}

//调用:
myData _pDate = new myData() { ID = 1, IP = "127.0.0.1" };

UpdateMyTable(_pData);

 

运行时,会抛出异常:不能添加其键已在使用中的实体。

原因我就不分析了,个人理解大致意思就是外部的对象跟DataContext上下文没关联,而Attach又不成功,所以当然也就更新不了.

解决办法(前提是不修改外部调用代码,仅在UpdateMyTable内部想招):

1.手动复制属性

db.myData.Attach(_pDate, db.myData.Single(c => c.ID == _pDate.ID));
        
改为
myData _data = db.myData.Single(c => c.ID == _pDate.ID);
_data.ID = _pDate.ID;
_data.IP = _pDate.IP;

这种方法当然是可行的,但是有点笨,这种不应该由人来干的傻活儿最好由电脑来完成(见下面的方法)

2.利用反射自动复制属性

先写一个方法,利用反射获取属性信息实现自动copy属性值

public static void CopyObjectProperty<T>(T tSource, T tDestination) where T : class
{
    //获得所有property的信息
    PropertyInfo[] properties = tSource.GetType().GetProperties();
    foreach (PropertyInfo p in properties)
    {
    p.SetValue(tDestination, p.GetValue(tSource, null), null);//设置tDestination的属性值              
    }
}

有了这个就方便多了

db.myData.Attach(_pDate, db.myData.Single(c => c.ID == _pDate.ID));

改为

Code
myData _data = db.myData.Single(c => c.ID == _pDate.ID);
CopyObjectProperty<myData>(_pData,_data);

搞定

欢迎转载但请注明来自[菩提树下的杨过]http://www.cnblogs.com/yjmyzz/archive/2009/04/20/1440014.html

时间: 2024-10-22 14:17:58

Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法的相关文章

事件之道~一 如何让实体发生更新时,同时记录它更新的内容到日志表

一 如何让实体发生更新时,同时记录它更新的内容到日志表  在日常生活中,有个订阅的事,如,订个报纸,当出版社出版后,报纸就会送到您家,你不用管它什么时候出版.  在OA系统或者后台管理系统中,修改一条记录,总是想把它记住,等数据出问题后,好有据可查. 如何去实现这样的效果呢,难道为每一个方法都写一个insertLog(log)方法吗?这也太不面向对象了吧,呵呵,做为一个懒型程序员,不会这样做的,呵呵. 像这样: 1 Log log=new Log{...}; 2 product.Update(e

电脑使用Chrome浏览器时提示“Adobe Flash Player 因过期而遭到阻止”的解决办法

  电脑使用Chrome浏览器时提示"Adobe Flash Player 因过期而遭到阻止"的解决办法 .有不少用户在电脑中使用Chrome浏览器时出现"Adobe Flash Player 因过期而遭到阻止"的提示,要求插件进行更新.如果出现这样的问题,我们可以尝试通过下面提供呢的方法来进行解决. 关于flash过期遭阻止的解决办法如下所示: 1.如果Flash插件不是最新版本,可以搜索Flash下载并安装; 2.安装后,在Chrome浏览器中输入chrome:

Mysql/MariaDB启动时处于进度条状态导致启动失败的原因及解决办法_mariadb

今天打开网站突然发现网站无法打开,后来通过SSH登陆服务器发现MARIADB数据库没有启动成功,再次启动还是无法成功启动,一直处于启动进度条,进度条结束后提示ERROR.查看日志出现以下错误: InnoDB: Unable to lock ./ibdata1, error: 11 后经调试发现是因为MariaDB数据库所在分区已经满了,造成无法启动. 只有将MariaDB数据库存放数据目录移动到另外一个磁盘份额比较大的分区或者将当前分配删除一些不必要的文件. 移动办法: 1.停掉mysql服务器

jar-import web工程时,tomcat包UNbound,包没引入?求解决办法

问题描述 import web工程时,tomcat包UNbound,包没引入?求解决办法 如题,这个UNbound是不是就是包没引入,我访问web是好像是servlet不能解析 解决方案 没有配置server吗,配置tomcat路径

Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

转自 http://www.cnblogs.com/babycool/archive/2011/11/17/2253349.html Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法  最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附加数据库文件时弹出错误信息:如下图:       ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊

html5-H5页面实现摇一摇功能 在ios上摇动时 出现 撤销 重做 弹出框?这个有什么解决办法?谢谢各位!

问题描述 H5页面实现摇一摇功能 在ios上摇动时 出现 撤销 重做 弹出框?这个有什么解决办法?谢谢各位! 如题,就是在摇动以后,就会出现的一个弹框.这个查了好久也没找到问题 解决方案 http://www.jb51.net/html5/64644.html

Sqlserver 2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法_mssql2005

最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用Sql Server2005附加数据库文件时弹出错误信息: 看到网友回复说:只需给Authenticated Users赋所有权限就行了. 本人也遇到类似的问题,但是解决方法很简单,只需要使用管理员的身份打开SQL Server Management Studio,即可附加数据库了 如下图:  ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊! 方案一:切换登

IE下载时提示 无法复制文件 无法读源文件或磁盘的解决办法

  今天在用IE7下载时,提示:无法复制文件 无法读源文件或磁盘 搞不懂哪里出错了,一开始以为硬盘坏了...不过终于花了10几分钟搞定! 如果有遇到此问题的朋友,看看下面我的操作即可解决. 也可能是服务器提供的文件正在使用,或确实是服务器无法连接跟个人机器无关,可以换个地址试试,实在不行就换个浏览器试试.(例如 搜狗 360等都可以)

Linux执行.sh文件时提示No such file or directory该怎么办(三种解决办法)_linux shell

先给大家看下问题描述,下图是我在运行时出现错误截图: 解决方法 分析原因,可能因为我平台迁移碰到权限问题我们来进行权限转换 1)在Windows下转换: 利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换,再放到Linux中执行.转换方式如下(UltraEdit):File-->Conversions-->DOS->UNIX即可. 2)方法 用vim打开该sh文件,输入: [plain] :set ff  回车,显示fileformat=dos,重新设置下文件格式