2011-03-06 153 views
3

我有一個用php寫的我的寵物項目。我的代碼所做的一件工作是加載一堆csv文件,並將它們寫入到具有自動生成的主鍵和多部分唯一鍵的MySQL表中。我沒有任何控制權和檢查方式是已經處理了一些文件,所以獨特的密鑰來得方便。我將數據插入INSERT IGNORE表中,當我嘗試插入已存在的數據並且所有工作都很好時,它會靜默失敗。ObjectContext.SaveChanges和重複的主鍵

現在,我試圖在C#4類似的項目中使用LINQ到實體,但是當我嘗試調用的對象ObjectContext.SaveChanges()方法從已經在表文件,UpdateException拋出與SqlClient.SqlException作爲內部異常。一個解決方案是將Ignore Duplicate Keys = Yes索引,它還挺作品,但

  • 在變更服務器上,而不是在客戶端
  • OptimisticConcurrencyException被套上更新與現有指數

有輕鬆優雅的方式來用L2E完成那些不涉及數據庫更改的插入?

+0

我建議保存更改之前,你檢查的唯一性的關鍵領域。 – RBZ 2011-10-07 18:32:09

回答

1

另一種解決方案是這樣的:

public void SaveAll(IEnumerable<Entity> entities) 
{ 
    var ids = entities.Select(x => x.Id).ToList(); 
    var idsToRemove = context.Entities.Where(x => ids.Contains(x.Id)).Select(x => x.Id).ToList(); 
    var entitiesToInsert = entities.Where(x => !idsToRemove.Contains(x.Id)); 

    foreach(var entity in entitiesToInsert) 
     context.Entities.AddObject(entity); 
}