我必须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();
}
}
这是一种有效的方式吗?或者我可以用更好的方式做到这一点?
答案 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));