2010-04-06 85 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