【问题标题】:Can Entity Framework add many related entities with single SaveChanges()?Entity Framework 可以使用单个 SaveChanges() 添加许多相关实体吗?
【发布时间】:2014-11-18 02:48:37
【问题描述】:

我正在向数据库写入许多(20 多个)父子数据集,而 EF 要求我在每组之间保存更改,否则它会抱怨无法找出主键。是否可以将数据刷新到 SQL Server,以便 EF 可以从身份中获取主键,并在写入所有更改结束时发送 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。

【问题讨论】:

    标签: c# entity-framework identity


    【解决方案1】:

    如果您使用对象引用新创建的对象而不是 ID,则无需每次都保存更改:

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

    【讨论】:

      【解决方案2】:

      因为它们都是新项目而不是

      itemTrackingID = addItemTracking.ItemTrackingID,
      

      你可以选择

      addItemTracking.InventoryTransaction = addInventoryTransaction;
      

      (或任何相关的导航属性)并将 _context.SaveChanges() 完全拉出循环。当一切都是新的时,实体框架非常擅长插入对象图。保存包含新项目和现有项目的对象图时,设置关联的 id 总是更安全。

      【讨论】:

        【解决方案3】:

        怎么样:

        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 了,上面的代码是用记事本写的,所以我不能保证

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 2021-07-14
          • 2016-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-09
          • 2011-02-07
          • 2013-07-21
          相关资源
          最近更新 更多