2011-02-26 42 views
3

我已成功使用序列化和反序列化來克隆EF實體。如果我將EntityKey設置爲無,我可以將其添加到上下文中。但是,當我嘗試SaveChanges時,出現錯誤,說明主鍵必須是唯一的。這是有道理的,因爲克隆具有相同的密鑰。所以我需要事先改變它。將克隆的EF實體保存到數據庫的問題

但是,主鍵在插入時由DB(SQLite)自動分配,並且由於PK不可爲空,因此我無法設置NewEntity.ID = Nothing,我認爲它會告訴上下文該實體應該接收臨時密鑰直到它被插入。

如果我設置NewEntity.ID = 30804328或一些任意的(未使用的)號碼,它將保存到DB罰款。但每次我想克隆一個實體時,我都非常懶惰地查詢一個未使用的ID值。

我知道上下文會在「添加對象」時將分離的實體視爲新對象,併爲其分配臨時密鑰,以便數據庫可以執行分配,然後上下文將接收更新。這不是這種情況嗎?

我該如何解決這個問題?感謝您的任何建議!

回答

1

我終於找到了解決辦法。問題在於涉及的表具有主鍵標識,但未設置Autoincrement。看起來,儘管ID鍵在創建新實體時默認爲零,並且不能通過賦值來更改,但在設置了自動增量的情況下會自動分配。但顯然,如果未設置自動增量(或計算),則無法自動解決。

3

這也是這裏介紹:Cloning data on Entity Framework

如果看起來像下面的代碼是要走的路:

context.Detach(entity);  
    entityCollection.Add(entity); 
    context.SaveChanges(); // New id will be assigned here 
+1

感謝您的回覆。我嘗試了序列化方法和鏈接中提供的其他代碼。我的問題不是克隆過程,也不是調用AddObject;這是插入數據庫。上下文不是指定臨時密鑰,而是保留原始密鑰並在插入時發生衝突。我不能將密鑰設置爲Nothing,因爲PK不可爲空。 – TripleAntigen 2011-02-27 02:40:12