我有users
表生成的LINQ-class,其结构如下:
class User {
int Id;
string Login;
string Password;
string Mail;
...
现在我需要更新指定的列(例如,只有登录名和密码),因为我不想覆盖其他字段,我的代码如下所示:
public User UpdateUser(int userId, User newUser)
{
User user = (from u in _context.Users
where u.Id == userId
select u).FirstOrDefault();
if (newUser.Login != default(string)) user.Login = newUser.Login;
if (newUser.Mail != default(string)) user.Mail = newUser.Mail;
if (newUser.Password != default(string)) user.Password = newUser.Password;
...
_context.SubmitChanges();
return user;
}
并称之为:
var user = new User { Password = "123" };
UpdateUser(123, user);
对于每个字段,我需要编写IF语句,并且我认为我做错了。另外因为我使用default(string)
的比较,我无法将空值设置为行。
请告诉我,这是怎么回事?
P.S。:对不起,我的英语不好。
答案 0 :(得分:1)
您滥用LINQ 2 SQL。你不应该使用通用的UpdateUser
方法,因为你不需要它。如果你想写一个实体的某个字段,就这样做:
var user = GetUser(userId);
user.Password = "123";
你已经完成了。对对象模型进行所有更改后,最后调用SubmitChanges
。每次突变后都没有必要调用它。
您正在使用LINQ 2 SQL作为CRUD存储库,但它不应该是一个。它旨在为您提供一个可以像普通C#对象一样对待的实时对象模型。最后,通过调用SubmitChanges
来与数据库同步。
答案 1 :(得分:0)
只需使用SubmitChanges:
即可This gets the user:
var user=context.User.Where(m=>m.id == "xyz").FirstOrDefault();
This updates the above user:
user.Password = "xyz";
context.User.SubmitChanges();
答案 2 :(得分:-1)
我认为你正在寻找错误的优化方式。单列上的update
命令与PK上的每个其他列的命令不同。您的验证逻辑可能比优化的update
命令需要更多时间来处理。
但是,如果始终是需要更新的密码,您可以这样做:
public User ChangePassword(int userId, string password)
{
var user = new User() { Id = userId };
_context.Users.Attach(user);
user.Password = password;
_context.SaveChanges();
return user;
}