2010-10-17 26 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