2014-09-23 14 views
7

Tôi đang viết nhiều (20+) bộ dữ liệu con của cha mẹ vào cơ sở dữ liệu, và EF yêu cầu tôi phải sửa đổi giữa mỗi bộ, mà không có nó phàn nàn về việc không thể tìm ra khóa chính. Dữ liệu có thể được xả vào máy chủ SQL sao cho EF có thể lấy lại các khóa chính từ danh tính, với các SaveChanges được gửi vào cuối viết tất cả các thay đổi?Can Entity Framework có thể thêm nhiều thực thể liên quan với một SaveChanges() đơn lẻ?

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(); 
} 

Tôi muốn thực hiện SaveChang của mình chỉ một lần ở cuối vòng lặp lớn.

Trả lời

13

Bạn don `t cần để lưu thay đổi mỗi lần nếu bạn sử dụng các đối tượng refernces các đối tượng mới được tạo ra không ID:

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

Vì họ đang tất cả các mục mới chứ không phải là

itemTrackingID = addItemTracking.ItemTrackingID, 

bạn có thể đi với

addItemTracking.InventoryTransaction = addInventoryTransaction; 

(hoặc bất kỳ thuộc tính điều hướng được liên kết nào) và kéo _context.SaveChanges() ra khỏi vòng lặp hoàn toàn. Entity Framework rất tốt khi chèn đồ thị đối tượng khi mọi thứ đều mới. Khi lưu đồ thị đối tượng chứa cả mục mới và mục hiện tại, việc đặt id được liên kết luôn an toàn hơn.

0

Làm thế nào về:

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(); 

Tuy nhiên tôi chưa từng làm việc với EF cho khá trong một và trên mã được viết bằng notepad vì vậy tôi không thể xác minh cho nó

Các vấn đề liên quan