2014-09-23 8 views
7

Veritabanına birçok (20+) üst düzey alt veri kümesi yazıyorum ve EF, her bir grup arasında geçiş yapmamı gerektiriyor; ancak bu, birincil anahtarı anlayamama konusunda şikayette bulunuyor. Veriler SQL Server'a akabilir mi? Böylece EF, birincil anahtarları kimliklerden geri alabilir, böylece SaveChanges tüm değişikliklerin yazılmasının sonunda gönderilir.Entity Framework, tek bir SaveChanges() ile ilgili birçok varlığı ekleyebilir mi?

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'i büyük döngünün sonunda yalnızca bir kez yapmak istiyorum.

Sen yeni oluşturulan nesnelere değil kimlikleri için referanslarını nesneleri kullanırsanız her zaman değişiklikleri kaydetmek için ihtiyacım yok

cevap

13

:

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

hepsi yeni öğeler olduğundan beri yerine

itemTrackingID = addItemTracking.ItemTrackingID, 

sen

addItemTracking.InventoryTransaction = addInventoryTransaction; 

(ya da her türlü ilişkili navigasyon özelliktir) ile gitmek ve _context.SaveChanges çekebilirdi() tamamen döngü dışı. Varlık Çerçevesi, her şey yeni olduğunda nesne grafikleri eklemekte çok iyidir. Yeni ve mevcut öğeleri içeren nesne grafiklerini kaydederken, ilişkili kimliği ayarlamak her zaman daha güvenlidir.

0

nereden: Ben uzunca bir süre ve kodunun üzerinde EF ile çalışmamış Ancak

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

not defteri yazılır Ben

için kefil olamaz bu yüzden