2014-09-23 112 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工作了相当长的一段和上面的代码写在记事本中,所以我不能保证它