2010-04-06 115 views
1

我正在編寫一個處理大量數據的小應用程序。我想用LINQ EF做這件事,因爲速度不是問題,它是一個單用戶應用程序,最終只能每月使用一次。使用ADO.NET實體框架批量插入和更新

我的問題圍繞着使用LINQ EF進行批量插入的最佳方式。

解析傳入的數據流後,我得到一個值列表。由於最終用戶可能最終嘗試導入一些重複數據,因此我希望在插入期間「清理」數據,而不是讀取所有記錄,執行for循環,拒絕記錄,然後最後導入餘數。

這是我目前在做什麼:

DateTime minDate = dataTransferObject.Min(c => c.DoorOpen); 
DateTime maxDate = dataTransferObject.Max(c => c.DoorOpen); 

using (LabUseEntities myEntities = new LabUseEntities()) 
{ 
    var recCheck = myEntities.ImportDoorAccess.Where(a => a.DoorOpen >= minDate && a.DoorOpen <= maxDate).ToList(); 
    if (recCheck.Count > 0) 
    { 
     foreach (ImportDoorAccess ida in recCheck) 
     { 
      DoorAudit da = dataTransferObject.Where(a => a.DoorOpen == ida.DoorOpen && a.CardNumber == ida.CardNumber).First(); 
      if (da != null) 
       da.DoInsert = false; 
     } 
    } 

    ImportDoorAccess newIDA; 
    foreach (DoorAudit newDoorAudit in dataTransferObject) 
    { 
     if (newDoorAudit.DoInsert) 
     { 
      newIDA = new ImportDoorAccess 
      { 
       CardNumber = newDoorAudit.CardNumber, 
       Door = newDoorAudit.Door, 
       DoorOpen = newDoorAudit.DoorOpen, 
       Imported = newDoorAudit.Imported, 
       RawData = newDoorAudit.RawData, 
       UserName = newDoorAudit.UserName 
      }; 
      myEntities.AddToImportDoorAccess(newIDA); 
     } 
    } 
    myEntities.SaveChanges(); 
} 

我也收到此錯誤:

System.Data.UpdateException was unhandled
Message="Unable to update the EntitySet 'ImportDoorAccess' because it has a DefiningQuery and no element exists in the element to support the current operation."
Source="System.Data.SqlServerCe.Entity"

我在做什麼錯?

歡迎任何指針。

回答

2

你可以用這種方法進行多次插入。

我看到了在模型(EDMX)設置不正確的情況下得到的異常。您在該表上沒有主鍵(EF中的EntityKey),或者設計者試圖猜測EntityKey應該是什麼。在後一種情況下,您將在EDM Designer中看到兩個或更多個屬性,並在它們旁邊有鍵。

確保ImportDoorAccess表具有單個主鍵並刷新模型。

+0

就像一個冠軍!由於這些是進口表,我沒有對他們進行PK。現在我擁有了,並且刷新了我的模型,沒有更多的錯誤!謝謝。 – 2010-04-06 22:13:59

相關問題