使用EF

时间:2016-10-15 04:31:48

标签: c# entity-framework

我必须update single field in my database使用EF。我这样做是这样的:

  

1 - 根据名称

从表中加载原始记录      

2 - 更新字段值

     

3 - 将对象保存回db

代码:

public void UpdateUser(List<User> users)
{
    foreach (User user in users)
    {
        Job original = _context.Users.Where(x => x.Name == user.Name).AsNoTracking().FirstOrDefault();
        if (original != null)
        {                   
            original.Name = user.Nanme;
            _context.Entry(original).State = EntityState.Modified; // not sure it is needed or not
        }
        _context.SaveChanges();           

    }
}

这是一种有效的方式吗?或者我可以用更好的方式做到这一点?

3 个答案:

答案 0 :(得分:0)

  

根据名称从表中加载原始记录。

这不是一个好的做法,你应该根据id

获得记录
  Job original = _context.Users.Where(x => x.id== user.id).AsNoTracking().FirstOrDefault();

并且_context.SaveChanges();应该在foreach的一边,因此更新将执行一次。

这里需要_context.Entry(original).State = EntityState.Modified;,表示实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被修改。

所以最后你的代码看起来像是:

foreach (User user in users)
{
  Job original = _context.Users.Where(x => x.id== user.id).AsNoTracking().FirstOrDefault();
  if (original != null)
  {                   
    original.Name = user.Nanme;
   _context.Entry(original).State = EntityState.Modified;
  }                      
}
 _context.SaveChanges(); 

希望这有帮助!

答案 1 :(得分:0)

这个怎么样,

foreach (User user in users)
{
  _context.Users.Find(user.id).Name = user.Name;
}                      
_context.SaveChanges(); 

答案 2 :(得分:0)

如果您只想更新Name字段而无需重新获取整个实体,则可以执行以下操作:

foreach (var usr in users)
{
    var user = new User { Id = usr.Id, Name = usr.Name };
    _context.Users.Attach(user);
    _context.Entry(user).Property(x => x.Name).IsModified = true;
}

_context.SaveChanges();

在这种情况下,如果EF跟踪用户,当您附加user时,您将获得例外,并且无需附加。

另一种方法是使用SQL命令:

_context.Database.ExecuteSqlCommand("UPDATE dbo.Users SET Name = @Name WHERE Id = @Id", 
   new SqlParameter("@Name", user.Name), 
   new SqlParameter("@Id", user.Id));
相关问题