通过传递值对象使用Linq更新记录

时间:2014-02-21 09:41:53

标签: c# linq

我正在尝试用3层方法编程。所以我创建了一个值对象层,我创建了一个像这样的用户对象值:

public class VOuser:MainClass
{
    public string _username;
    public string _password;
    public string _email;
    public string _mobile;
    public DateTime _dateOfRegister;
    public string _name;
    public string _family;

    public VOuser()
    {
        _BUuser=new BUUser();
    }
    public EnumUserPermission Permission
    {
        get { return _permission; }
        set { _permission = value; }
    }

    public string Username
    {
        get { return _username; }
        set { if(value=="")message("لطفا نام کاربری را وارد کنید"); _username = value; }
    }

    public string Password
    {
        get { return _password; }
        set { if (value == "")message("لطفا کلمه عبور را وارد کنید"); _password = value; }
    }

    public string Email
    {
        get { return _email; }
        set { if (value == "")message("لطفا رایانامه را وارد کنید"); _email = value; }
    }

    public string Mobile
    {
        get { return _mobile; }
        set { if (value == "")message("لطفا شماره موبایل را وارد کنید"); _mobile = value; }
    }

    public DateTime DateOfRegister
    {
        get { return _dateOfRegister; }
        set { _dateOfRegister = DateTimeNow(); }
    }

    public string Name
    {
        get { return _name; }
        set { if (value == "")message("لطفا نام را وارد کنید"); _name = value; }
    }

    public string Family
    {
        get { return _family; }
        set { if (value == "")message("لطفا نام خانوادگی را وارد کنید"); _family = value; }
  }

   public  void edit()
   {
       _BUuser._VOUser=this;
       _BuUser.Edituser();
   }
}

因此,在另一个业务层中,我想创建一个可以在数据库中编辑我的记录的方法。我将用户值对象传递给Business层,我的Business层通过以下函数执行此操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using novitiate.DataAccesslayer;
using novitiate.ValueObjectLayer;

namespace novitiate.BusinessLayer
{
    public class BUUser:BuMainClass
    {
        protected DataAccesslayer.tblUser _userDA;
        public ValueObjectLayer.VOuser _VOUser;

    public BUUser()
    {
        _userDA=new tblUser();
    }

    public  bool AddUser()
    {
        _userDA.userName = _VOUser.Username;
        _userDA.password = _VOUser.Password;
        _userDA.email = _VOUser.Email;
        _userDA.mobile = _VOUser.Mobile;
        _userDA.dateOfRegister = _VOUser.DateOfRegister;
        _userDA.name = _VOUser.Name;
        _userDA.family = _VOUser.Family;
        dbconnect.tblUsers.InsertOnSubmit(_userDA);
        dbconnect.SubmitChanges();
        return true;
    }

    public bool Edituser()
    {
        _userDA.userName = _VOUser.Username;
        _userDA.password = _VOUser.Password;
        _userDA.email = _VOUser.Email;
        _userDA.mobile = _VOUser.Mobile;
        _userDA.dateOfRegister = _VOUser.DateOfRegister;
        _userDA.name = _VOUser.Name;
        _userDA.family = _VOUser.Family;
        dbconnect.SubmitChanges();
        return true;
    }
}

所以我在用户对象层调用编辑功能。

我的问题在于编辑功能。你认为我使用的模型是否有效或我应该使用这样的东西:

public bool Edituser()
{
    var q = from i in dbconnect.tblUsers where i.userName == _VOUser.Username select i;

    q.First().password = _VOUser.Password;
    q.First().email = _VOUser.Email;
    q.First().mobile = _VOUser.Mobile;
    q.First().dateOfRegister = _VOUser.DateOfRegister;
    q.First().name = _VOUser.Name;
    q.First().family = _VOUser.Family;
    dbconnect.SubmitChanges();
    return true;
}

我想在没有Select查询的情况下编辑我的记录。我只想将我的新用户值对象传递给我的编辑功能,我的函数只是调用submit.change(); 一切都没问题;

1 个答案:

答案 0 :(得分:3)

让我们看看你的代码

public bool Edituser()
{
    var q = from i in dbconnect.tblUsers 
            where i.userName == _VOUser.Username 
            select i;

    q.First().userName = _VOUser.Username;
    q.First().password = _VOUser.Password;
    q.First().email = _VOUser.Email;
    q.First().mobile = _VOUser.Mobile;
    q.First().dateOfRegister = _VOUser.DateOfRegister;
    q.First().name = _VOUser.Name;
    q.First().family = _VOUser.Family;
    dbconnect.SubmitChanges();
    return true;
}

这里发生了什么 - 每次拨打First()时都在执行查询。因此,您定义了查询以按名称选择用户。然后查询第一个用户并设置其名称(为什么?)。然后,您再次查询第一个用户并设置其密码。然后,您再次查询第一个用户并设置其电子邮件。等

您需要的是查询用户一次,然后更新并提交更改:

public bool Edituser()
{
    var user = 
        dbconnect.tblUsers.SingleOrDefault(u => u.userName == _VOUser.Username);

    if (user == null)
        // throw exception

    user.password = _VOUser.Password;
    user.email = _VOUser.Email;
    user.mobile = _VOUser.Mobile;
    user.dateOfRegister = _VOUser.DateOfRegister;
    user.name = _VOUser.Name;
    user.family = _VOUser.Family;
    dbconnect.SubmitChanges();
    return true;
}

注意 - 您可以使用映射工具自动映射实体之间的属性。例如。 AutoMapper将为您完成:

public bool Edituser()
{
    var user = 
        dbconnect.tblUsers.SingleOrDefault(u => u.userName == _VOUser.Username);

    if (user == null)
        // throw exception

    Mapper.Map(_VOUser, user);
    dbconnect.SubmitChanges();
    return true;
}

另外,我会将与数据访问相关的操作移到单独的类,例如UserRepository。另一件看起来很奇怪的事情是你的Edituser()不接受应该更新的用户。我希望签名为public bool Update(VOuser voUser)