2014-11-08 107 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,然后你就完成了。