LINQ to SQL C#更新类

时间:2014-07-20 16:50:53

标签: c# sql linq

我有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。:对不起,我的英语不好。

3 个答案:

答案 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;
}