2015-03-31 79 views
0

我從一個網頁更新的對象的列表:在EF 6中處理CRUD操作的正確方法在處理集合時?

實體

public partial class MyParentType 
    { 
     public MyParentType() 
     { 
      this.children = new HashSet<child>(); 
     } 

     public int parentID { get; set; } 

     public virtual ICollection<child> children { get; set; } 
    } 

CRUD操作:

public class MyRepository : IMyRepository 
    { 
     private readonly IErrorLogger _logger; 
     private readonly CorporateEntities _context; 

     public MyRepository(IErrorLogger logger) 
     { 
      _logger = logger; 
      _context = new CorporateEntities(); 
     } 

     public void Update(IEnumerable<MyParentType> parents) 
{ 
    try 
    { 
     foreach (var parent in parents) 
     { 
     if(parent.Id==0) 
     { 
      _context.MyParentTypes.Add(parent); 
     } 
     else 
     { 
      _context.Entry(parent).State = EntityState.Modified; 
      var removedChildren = 
          _context.Children.Where(
           x => !fuelProcessing.Children.Select(
            y => y.ID).Contains(x.ID)); 
      _context.Children.RemoveRange(removedChildren); 

      foreach(var child in parent.children) 
      { 
       context.Entry(child).State =child.Id>0? EntityState.Modified:EntityState.Added; 
      } 
     } 
     } 

     _context.SaveChanges(); 
    } 
    catch (Exception exception) 
    { 
    _logger.Error(exception.Message, exception); 
    } 
    } 

} 

什麼是正確的方式來添加新項目,更新現有的項目並刪除已在屏幕上刪除的項目?這看起來非常麻煩,我相信還有更好的辦法。

回答

0

首先,如果你使用虛擬,它會很慢,我會建議你使用急切加載而不是延遲加載。

當您更新父母時,如果您沒有更新孩子,則不必加載孩子。

如果您還需要加載子項,您可以一次性獲得所有項目,而不是逐個項目,效率更高。

+0

我確實需要每次更新孩子。你能給出一個模板化的例子嗎? – Robert 2015-03-31 16:11:58

+0

如果你需要更新孩子,你可以一次加載它們。看看急切的加載。 – DarthVader 2015-03-31 16:18:37

相關問題