2011-04-01 71 views
3

我有,我想創建一個地址對象的一個​​副本的方法。地址有一個對StateProvince的外鍵引用。實體的實體框架4問題保存克隆與查找參考

// ... get address from context 
var newAddress = Util.DataContractSerialization<Address>(sourceAddress); // serializes and deserializes into/from memory 
newAddress.AddressId = Guid.Empty; 
ctx.Attach(newAddress); // error! 

我應該怎麼做?這種錯誤的原因是因爲當我調用Attach時嘗試附加整個對象圖時,StateProvince屬性已經在上下文中。我當前的解決方法是顯式複製StateProvinceId而不是StateProvince對象的助手方法。

我可以想象這個錯誤可能發生在其他情況下,所以我想弄清楚解決這個問題的正確方法。

回答

2

是的,這是因爲序列化使得整個對象圖的深克隆。當您只需克隆頂級對象時,不需要進行深度克隆。我通常通過在實體上實現ICloneable來實現這一點,並且在沒有它的關係的情況下手動克隆實體。除了manullay將所有導航屬性標記爲不可序列化(IgnoreDataMemberAttribute或在數據合同序列化的情況下不標記爲DataMember)之外沒有更好的方法。

+0

我不想將它們標記爲不可序列化,因爲我也是通過Web服務發送它們。有沒有辦法不附加整個對象圖,但只是頂部的項目,它是FK ID? – 2011-04-01 14:14:38