zoukankan      html  css  js  c++  java
  • 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
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    谈谈Android重打包--初语
    Servlet注解
    提高打开Android本地文档的速度
    内置传感器---智能手机(资料)
    数学分析里面的蕴含(⇒)究竟是什么意思
    [Xcode 实际操作]七、文件与数据-(20)CoreML机器学习框架:检测和识别图片中的物体
    [Xcode 实际操作]七、文件与数据-(19)颜色集(Color Set)的使用
    [Xcode 实际操作]七、文件与数据-(18)使用MarkMan与设计师进行心灵沟通
    [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
    [Xcode 实际操作]七、文件与数据-(16)解析XML文档
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1440014.html
Copyright © 2011-2022 走看看