代码之家  ›  专栏  ›  技术社区  ›  Seph

从linq中的另一个DataContex添加实体

  •  0
  • Seph  · 技术社区  · 14 年前

    我正在尝试使用Linq to sql在两个相同的模式数据库之间合并数据:

    List<Contact> contacts = (from c in oldDb.Contact
        select c).ToList();
    contacts.ForEach(c => c.CreatedByID = 0);
    newDb.Contact.InsertAllOnSubmit(contacts);
    newDb.SubmitChanges();
    

    仅仅抛出一个“试图附加或添加一个不是新的实体,可能是从另一个数据上下文加载的。不支持此操作。“异常。

    除执行以下操作外,如何在一般情况下(在合理的执行时间内)执行此操作:

    List<Contact> contacts = (from c in oldDb.Contact
        select c).ToList();
    contacts.ForEach(c => { c.CreatedByID = 0; newDb.Contact.InsertAllOnSubmit(contacts); });
    newDb.SubmitChanges();
    

    随着:

    private t GetNewObject<t>(t oldObj)
    {
        t newObj = (t)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(typeof(t).Name);
    
        PropertyInfo[] props = typeof(t).GetProperties();
        foreach (PropertyInfo _prop in props)
        {
            _prop.SetValue(newObj, _prop.GetValue(oldObj, null), null);
        }
        return newObj;
    }
    

    问题是,当只有11个对象和75个属性时,这种方法相当慢,我需要为几十万个对象执行此操作,这样在这一端获得的任何性能提升都将大大减少总体运行时间。

    基本上,我是否可以执行任何分离或类似的调用来断开现有对象与旧数据上下文的连接并将它们连接到新数据上下文。不必为返回的每一行创建所有新对象。

    1 回复  |  直到 14 年前
        1
  •  0
  •   ariel    14 年前

    我没有得到

    contacts.ForEach(c => { c.CreatedByID = 0; newDb.Contact.InsertAllOnSubmit(contacts); });
    

    不应该是

    contacts.ForEach(c => { 
        Contact c2 = GetNewObject<Contact>(c); 
        c2.CreatedByID = 0; 
        newDb.Contact.InsertOnSubmit(c2); 
    });
    

    另外,下面是从旧数据库分离对象的方法: http://omaralzabir.com/linq_to_sql__how_to_attach_object_to_a_different_data_context/