2014-09-23 368 views
7

我正在向數據庫寫入許多(20+)父級子數據集,並且EF要求我在每組之間保存更改,否則它會抱怨無法找出主鍵。數據是否可以刷新到SQL Server,以便EF可以從身份獲取主鍵,在編寫所有更改結束時發送SaveChanges?實體框架可以使用單個SaveChanges()添加許多相關實體嗎?

foreach (var itemCount in itemCounts) 
{ 
    var addItemTracking = new ItemTracking 
    { 
     availabilityStatusID = availabilityStatusId, 
     itemBatchId = itemCount.ItemBatchId, 
     locationID = locationId, 
     serialNumber = serialNumber, 
     trackingQuantityOnHand = itemCount.CycleQuantity 
    }; 
    _context.ItemTrackings.Add(addItemTracking); 
    _context.SaveChanges(); 
    var addInventoryTransaction = new InventoryTransaction 
    { 
     activityHistoryID = newInventoryTransaction.activityHistoryID, 
     itemTrackingID = addItemTracking.ItemTrackingID, 
     personID = newInventoryTransaction.personID, 
     usageTransactionTypeId = newInventoryTransaction.usageTransactionTypeId, 
     transactionDate = newInventoryTransaction.transactionDate, 
     usageQuantity = usageMultiplier * itemCount.CycleQuantity 
    }; 
    _context.InventoryTransactions.Add(addInventoryTransaction); 
    _context.SaveChanges(); 
} 

我想在大循環結束時只做一次SaveChanges。

回答

13

客人不願意需要,如果你使用對象refernces到新創建的對象的ID不能每次保存更改:

var addItemTracking = new ItemTracking 
{ 
    ... 
} 
_context.ItemTrackings.Add(addItemTracking); 
var addInventoryTransaction = new InventoryTransaction 
{ 
    itemTracking = addItemTracking, 
    ... 
}; 
_context.InventoryTransactions.Add(addInventoryTransaction); 
... 
_context.SaveChanges(); 
3

因爲他們是所有新項目,而不是

itemTrackingID = addItemTracking.ItemTrackingID, 

你可以與

addItemTracking.InventoryTransaction = addInventoryTransaction; 

(或任何相關的導航屬性是)並拉動_context.SaveChanges ()完全退出循環。當一切都是新的時候,Entity Framework非常擅長插入對象圖。當保存包含新項目和現有項目的對象圖表時,設置關聯的ID總是比較安全。

0

如何:

var trackingItems = itemCounts 
    .Select(i => new ItemTracking 
     { 
      availabilityStatusID = availabilityStatusId, 
      itemBatchId = i.ItemBatchId, 
      locationID = locationId, 
      serialNumber = serialNumber, 
      trackingQuantityOnHand = i.CycleQuantity 
     }); 
_context.ItemTrackings.AddRange(trackingItems); 
_context.SaveChanges(); 

var inventoryTransactions = trackingItems 
    .Select(t => new InventoryTransaction 
     { 
      activityHistoryID = newInventoryTransaction.activityHistoryID, 
      itemTrackingID = t.ItemTrackingID, 
      personID = newInventoryTransaction.personID, 
      usageTransactionTypeId = newInventoryTransaction.usageTransactionTypeId, 
      transactionDate = newInventoryTransaction.transactionDate, 
      usageQuantity = usageMultiplier * t.trackingQuantityOnHand 
     }); 
_context.InventoryTransactions.AddRange(inventoryTransactions); 
_context.SaveChanges(); 

但是我還沒有與EF工作了相當長的一段和上面的代碼寫在記事本中,所以我不能保證它