2010-10-17 27 views
0

添加一个实体我试图合并使用两个相同的架构数据库之间的数据的LINQ到SQL:从另一个DataContex在LINQ

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

仅仅抛出一个“尝试已经取得了附加或添加不是新的实体,可能是从另一个DataContext加载的,不支持。“例外。

除执行以下操作,还能怎么这个被一般做(在合理的执行时间):

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个属性,我需要为数十万个对象执行此操作,所以我可以在此处获得的任何性能提升都会大大减少总体运行时间。

基本上,是否有任何Detach或类似的调用我可以做,将断开旧的DataContext的现有对象,并将它们连接到新的DataContext。无需为每个返回的行创建所有新对象。

回答

0

我没有拿到

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/

+0

有没有办法做到这一般地,看到我的问题在这里http://stackoverflow.com/questions/3952160/setting-entityreft-properties-to-default-using-reflection – Seph 2010-10-17 05:32:03