Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法
时间:2022-04-23
本文章向大家介绍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);
搞定
欢迎转载但请注明来自[菩提树下的杨过]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端学数据结构与算法(三):链表为什么能和数组相提并论?用链表实现数组bettle下
- 前端学数据结构与算法(二):数组的操作特性与栈的应用
- 前端学数据结构与算法(一):不会复杂度分析,算法等于白学
- 高可扩展性系统的设计
- Vue如何实现导出页面为PDF
- 短视频APP开发,如何做到获取播放视频和音频文件
- 3分钟短文:Laravel模型创建数据条目的2个语法糖
- leetcode队列之最近的请求次数
- 路由策略中的IP-Prefix你了解多少?
- Qt音视频开发29-Onvif云台控制
- 十大高性能开发
- 【云+社区年度征文】java agent及字节码技术得到DNS时间流程尝试
- 短视频商城源码,制作彩色验证码
- ubuntu下的mysql安装与使用
- 排序算法