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);

搞定

欢迎转载但请注明来自[菩提树下的杨过]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师学习

分布式消息队列Apache RocketMQ源码剖析-Producer分析正文总结

正文 首先我们看一下Producer的继承结构: ? image.png MQAdmin主要包含一些管理性的接口,比如创建topic、查询某个特定消息以方便排查...

42770
来自专栏dotnet & java

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文...

14120
来自专栏码匠的流水账

httpclient参数配置

默认的话,是从response里头读timeout参数的,没有读到则设置为-1,这个代表无穷,这样设置是有点问题了,如果是https链接的话,则可能会经常报

62710
来自专栏Java与Android技术栈

基于RxJava2实现的简单图片爬虫

今年十月份以来,跟朋友尝试导入一些图片到tensorflow来生成模型,这就需要大量的图片。刚开始我只写了一个简单的HttpClient程序来抓取图片,后来为了...

16720
来自专栏JackieZheng

探秘Tomcat——启动篇

tomcat作为一款web服务器本身很复杂,代码量也很大,但是模块化很强,最核心的模块还是连接器Connector和容器Container。具体请看下图: ? ...

50170
来自专栏潇涧技术专栏

Pury Project Analysis

Pury的源码:https://github.com/NikitaKozlov/Pury

9520
来自专栏hotqin888的专栏

engineercms利用pdf.js制作连续看图功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

19410
来自专栏技术记录

前端插件——头像截图上传插件的使用(带后台)

效果图:实现上传头像,右边是预览,有三个大小,可以对头像进行裁剪 ? HTML: toParentData 和 img 返回的是图片裁剪后的base64编码。其...

1.1K50
来自专栏刘望舒

Android资源动态加载以及相关原理分析

思考 一般情况下,我们在设计一个插件化框架的时候,要解决的无非是下面几个问题: 四大组件的动态注册 组件相关的类的加载 资源的动态加载 实际上从目前的主流插件...

36380
来自专栏JadePeng的技术博客

Docker+Jenkins持续集成环境(5): android构建与apk发布

项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个...

53480

扫码关注云+社区

领取腾讯云代金券