2014-11-08 108 views
2

好了,所以我有這樣的代碼,以決定是否在數據庫中存在的一個項目:現在更新實體EF

foreach (var result in model.Results) 
      { 

       if (_ef.Results.Any(o=>o.Dog.DogId==result.Dog.DogId)) 
       { 
        result.Event = _ef.SingleEvent(result.Event.EventId); 
        result.Dog = _ef.SingleDog(result.Dog.DogId); 
        _ef.UpdateResult(result); 
       } 
       else 
       { 
        result.Event = _ef.SingleEvent(result.Event.EventId); 
        result.Dog = _ef.SingleDog(result.Dog.DogId); 
        _ef.SaveResult(result); 

       } 

      } 

,如果該項目不存在的,我有這樣的:

public void SaveResult(Result newResult) 
     { 
      _context.Results.Add(newResult); 
      _context.SaveChanges(); 
     } 

如果確實存在,我想更新它:

public void UpdateResult(Result result) 
     { 
      //Must be missing something here 
      _context.SaveChanges(); 
     } 

我在這裏錯過了一些明顯的東西嗎?由於

+0

難以張貼我的答案......現在看起來沒問題。希望我會幫助你。 – ilans 2014-11-08 23:16:17

回答

1

在我看來,處理像這樣的更新最可靠的方法是從數據存儲獲取現有的實體,然後將更新數據映射到它。換句話說,結果參數對象中的UpdateResult方法將永遠不會真正將其帶入數據庫,只是它攜帶的數據。事情是這樣的:

public void UpdateResult(Result result) 
{ 
    var existing = _context.Results.FirstOrDefault(x => x.Dog.DogId.Equals(result.Dog.DogId)); 
    if (existing == null) 
     throw new Exception("Result to update not found"); 

    existing.Name = result.Name; 
    .... map other relevant properties here... 

    _context.SaveChanges(); 
} 

在某些情況下我會使用某種類型的自動映射的,這取決於是否有需要在更新過程中要應用的業務規則。我更喜歡AutoMapper進行自動映射。

+0

這對我有用! – user2915962 2014-11-09 05:47:43

1

你需要調用SaveChanges前更改對象的狀態:

public void UpdateResult(Result result) { 
    // The missing something: 
    _context.Entry(result).State = EntityState.Modified; 
    _context.SaveChanges(); 
} 

另一種方法是調用:

_context.Attach(result); 

開始修改你的對象之前。在這種情況下,你只需要撥打Save Changes,然後你就完成了。